FreeBSD Jails dhidi ya Docker: Tofauti kuu
Jifunze tofauti za kiufundi kati ya FreeBSD Jails na Docker containers. Makala hii inachanganua jinsi mifumo hii inavyoshughulikia userland, mtandao, na usimamizi wa hali.
Ulinganisho wa FreeBSD jails na Docker containers, kwa aya moja
FreeBSD jails na Docker containers hutatua tatizo moja kwa njia mbili tofauti. Zote huendesha userland zilizotengwa kwenye kernel moja inayoshirikiwa, kwa hivyo hakuna hata moja inayofanya kazi kama virtual machine. Tofauti inakuja kwenye kile kinachowekwa ndani. Docker container huendesha mchakato mmoja kutoka kwenye layered image uliyopakua kutoka kwenye registry. Jail huendesha FreeBSD userland kamili: ina /etc yake yenyewe, script zake za kuanzisha mfumo za rc, database yake ya pkg, na michakato mingi kadiri unavyotaka. Karibu tofauti nyingine zote kwenye ukurasa huu hutokana na msingi huo mmoja.
SSD Nodes haitoi images za FreeBSD. Huwezi kukodisha seva ya FreeBSD kwenye jukwaa hili, na hakuna chochote hapa chini kinachoelekeza jinsi ya kusakinisha mfumo kwenye mashine unayoweza kununua hapa. Huu ni ulinganisho wa mifano miwili ya utengaji, ulioandikwa ili uweze kujua ni ipi inayofaa kwa kazi yako, na ili uweze kusoma usanidi wa timu ya FreeBSD bila kubahatisha.
Jail ni nini hasa
Jails zilianzishwa kwenye FreeBSD 4.0 mnamo Machi 2000, jambo linalozifanya kuwa za zamani zaidi kuliko cgroups na takriban muongo mmoja kabla ya Docker. Utaratibu huu ni wito mmoja wa kernel. jail(8) huchukua saraka (directory tree) na kuanzisha michakato ndani yake ikiwa imeambatishwa na jail ID, kisha kernel hukataa seti maalum ya shughuli kwa mchakato wowote wenye ID hiyo. Mchakato uliopo ndani ya jail hauwezi kuona michakato iliyo nje ya jail yake, hauwezi ku-mount au ku-unmount mifumo ya faili, hauwezi kupakia kernel modules, na hauwezi ku-bind kwenye anwani za mtandao ambazo jail hiyo haikupewa. Hakuna aina tofauti ya namespace ya kujifunza na hakuna chaguo la kuwasha kipengele kimoja baada ya kingine: vizuizi huja kama kitengo kimoja, vikirekebishwa na vigezo (parameters) vilivyopo kwenye usanidi wa jail.
Kwenye seva mwenyeji (host), jls huorodhesha jails zinazoendelea kufanya kazi na jexec web sh hukuweka ndani ya shell iliyo ndani ya jail yenye jina web.
Unajenga jail kwa kuweka FreeBSD userland ndani ya saraka. Mfumo wa msingi (base system) hukufanyia hivyo:
sudo bsdinstall jail /usr/local/jails/containers/webHiyo huchota seti ya usambazaji wa msingi kwa ajili ya toleo lako na kuendesha hatua za kawaida za baada ya usakinishaji, kwa hivyo unaweka nenosiri la root na kuchagua eneo la saa (timezone) kama ungefanya kwenye seva mpya. Matokeo yake ni usakinishaji wa FreeBSD uliopo ndani ya folda. Kisha unaielezea kwenye /etc/jail.conf:
web {
host.hostname = "web.example.internal";
path = "/usr/local/jails/containers/web";
ip4.addr = "10.0.0.10";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
mount.devfs;
}Ianzishe, kisha uikague:
sudo service jail start web
jlsjls sasa inapaswa kuorodhesha web ikiwa na JID, hostname yake na anwani yake ya IP. Ikiwa jail haionekani, endesha sudo jail -c web moja kwa moja. Inatumia usanidi uleule mbele ya macho yako na kuchapisha kigezo ambacho haikuweza kukikubali, badala ya kuacha hitilafu kwenye matokeo ya huduma.
Mstari unaostahili kusomwa mara mbili ni exec.start = "/bin/sh /etc/rc". Kuanzisha jail huendesha hati ya kawaida ya boot ya FreeBSD ndani yake, kwa hivyo jail huwasha kila huduma iliyowezeshwa kwenye /etc/rc.conf yake yenyewe. Docker container haina hatua inayolingana na hii, kwa sababu huendesha mchakato wa entrypoint wa image na kusimama wakati mchakato huo unaposimama.
Jinsi ya kupata programu: images na registries dhidi ya userland unayojaza
Huu ndio utofauti unaohisi katika siku ya kwanza.
Ukiwa na Docker, unataja programu na kuipokea. docker pull nginx huchota image iliyopangwa kwa tabaka na inayotambuliwa kwa maudhui yake, ambayo mtu mwingine aliijenga na kuifanyia majaribio, na docker compose up -d huianzisha ikiwa na volumes na mtandao wake vimeunganishwa. Registry ndiyo bidhaa yenyewe. Thamani kubwa katika workflow ya Docker ni kwamba maelfu ya miradi huchapisha image inayofanya kazi, jambo linalofanya kuendesha Docker kwenye VPS kuwa kazi fupi badala ya mradi mkubwa.
FreeBSD haitoi registry ya umma ya jail images kwa chaguo-msingi. Unatengeneza userland tupu na kusakinisha ndani yake, kwa njia ile ile unayoweza kusanidi seva tupu. Hii inahitaji kuandika zaidi. Pia ni wazi zaidi, kwa sababu kinachoendesha ndani ya jail ni kile ambacho pkg kiliweka hapo, kutoka kwenye seti ile ile ya vifurushi inayotumiwa na host.
Zana hufanya kazi hii kuwa fupi. BastilleBSD ni meneja wa kawaida wa jail na ni kifurushi:
sudo pkg install bastille
sudo sysrc bastille_enable=YES
sudo bastille setup
sudo bastille bootstrap 15.1-RELEASEbastille setup husanidi mtandao, hifadhi na firewall kwa ajili yako. bastille bootstrap hupakua release mara moja, na kila jail unayotengeneza baadaye hutumia tena faili hizo. FreeBSD 15.1 ndiyo release ya sasa ya uzalishaji, iliyotoka Juni 2026; badilisha na release yoyote unayotumia.
Kutengeneza jail basi ni amri moja, na kuijaza ni nyingine:
sudo bastille create web 15.1-RELEASE 10.17.89.10/24
sudo bastille pkg web install nginx
sudo bastille service web nginx start
sudo bastille console webbastille console web hukupa login shell ndani ya jail, na bastille list huonyesha kilichopo kwenye host. Ili kurudia ujenzi, Bastille templates huhifadhi hatua kwenye faili na kuzitumia kwenye jail, jambo ambalo ndilo linalokaribia zaidi Dockerfile katika ulimwengu huu. Template huchezwa tena kwenye kila jail. Hakuna kinachofika kikiwa kimejengwa tayari.
Kwa hivyo muhtasari wa kweli ni mfupi. Docker hukupa ujenzi wa watu wengine. Jails hukupa usakinishaji wako mwenyewe. Ikiwa programu iliyo kwenye orodha yako fupi inatolewa kama container image pekee, hilo linahitimisha swali hilo kabla ya kigezo kingine chochote kupigiwa kura.
Hali na maboresho: sehemu ya mabadiliko ya ZFS
Docker hutenganisha hali (state) kwa makusudi. Mfumo wa faili wa container ni wa muda, data yako huishi kwenye named volume au bind mount, na uboreshaji ni docker compose pull ikifuatiwa na docker compose up -d. Container hubadilishwa, na chochote ambacho hukukiweka kwenye volume hupotea. Hiyo ni sifa ya mfumo unapofuata kanuni, na ni tukio la kupoteza data unapoisahau, ndiyo maana chaguo kati ya bind mounts na named volumes lina uzito mkubwa katika stack ya Compose.
Jail haitenganishi hali, na ZFS ndiyo sababu hiyo inafanya kazi. Jail nzima ni dataset moja:
sudo zfs snapshot zroot/jails/containers/web@pre-upgrade
sudo pkg -j web upgrade
sudo zfs rollback zroot/jails/containers/web@pre-upgradeHakiki jina halisi la dataset kwa zfs list kabla ya kuendesha amri hii; njia iliyo hapo juu ni mpangilio unaotumiwa na mwongozo. Snapshot huchukua sekunde moja na haitumii nafasi yoyote hadi yaliyomo kwenye jail yabadilike. Ikiwa uboreshaji utaharibu huduma, rollback huirudisha userland nzima kwenye hali yake ya awali, ikijumuisha database ya vifurushi na faili za usanidi ulizohariri mwenyewe saa 8 usiku. Docker haina mfumo kama huu, kwa sababu mtindo wake unadhani hukuwahi kuhitaji.
zfs clone ni nusu nyingine. Clone ya snapshot ni jail mpya inayoweza kuandikwa ambayo inashiriki blocks zisizobadilika na mzazi wake, kwa hivyo nakala ya staging ya jail ya 3 GB haigharimu chochote kwenye diski hadi uanze kuibadilisha. Hivyo ndivyo msimamizi wa FreeBSD anavyounda jail ya "kama ya production" ili kufanyia mazoezi uboreshaji.
Uboreshaji wa mfumo wa msingi (base system) ni tofauti na vifurushi. Kwa jail inayoshikilia nakala yake ya userland:
sudo freebsd-update -b /usr/local/jails/containers/web fetch installThin jails huepuka kurudia kazi hiyo. Hupachika (mount) msingi mmoja ulioshirikiwa wa kusoma pekee (read-only) kupitia nullfs na kuipa kila jail safu ndogo inayoweza kuandikwa, kwa hivyo unarekebisha msingi mara moja na kila jail huona matokeo. Bastille huunda thin jails kwa chaguo-msingi.
Networking: bandari zilizochapishwa dhidi ya uamuzi wa anwani
Docker huamua mtandao kwa ajili yako na kukuomba uchapishe isipokuwa (exceptions). Containers huwekwa kwenye bridge, huwasiliana kwa kutumia jina la huduma kwenye mtandao uliotengenezwa na mtumiaji, na -p 8080:80 hufichua mojawapo kwa host. Docker huandika sheria zake za kuchuja pakiti (packet filter rules) ili kufanikisha hilo, jambo ambalo ndilo pia husababisha bandari ya container iliyochapishwa kupita moja kwa moja kwenye ufw.
Jail inakulazimisha kuchagua modeli tangu mwanzo, na zipo mbili.
Shared IP. ip4.addr = "10.0.0.10" huongeza anwani hiyo kwenye interface ya host iliyopo na kuzuia jail kuitumia hiyo pekee. Jail haina network stack yake yenyewe, kwa hivyo haiwezi kuendesha firewall yake. Pia haiwezi kufunga (bind) kwenye anwani zote: socket ya jail inayoomba 0.0.0.0 huandikwa upya na kernel kwenda kwenye anwani ya jail yenyewe. Jail mbili haziwezi kusikiliza kwenye port 80 ya anwani moja, kwa hivyo unatoa kila moja anwani yake, au unaweka reverse proxy mbele.
VNET. Ongeza vnet; kwenye jail na itapata network stack kamili: interfaces zake, routing table yake, na sheria zake za firewall. Unaiunganisha na host kwa kutumia epair, kebo ya mtandao pepe yenye ncha moja kila upande, na kuweka ncha ya host kwenye bridge. Hii ndiyo inayokaribiana zaidi na kile Docker inachokupa, na ndiyo mode inayotumiwa na aina za jail za -V na -B katika Bastille.
Kupeleka (forward) bandari ya host ndani ya jail ni sheria ya kuelekeza upya ya pf. Bastille huifunga (wrap) hivi:
sudo bastille rdr web tcp 80 80Hakuna EXPOSE na hakuna uchapishaji wa kiotomatiki. Hakuna kinachofika kwenye jail isipokuwa anwani yake au sheria ya kuelekeza upya ikiruhusu. Hiyo ni hatua ya kuanza polepole zaidi na firewall tulivu zaidi.
Vikomo vya rasilimali: cgroups dhidi ya rctl
Docker huwekea container kikomo kwa kutumia cgroups, na vikomo hivyo hukaa mahali ambapo container imefafanuliwa: --memory=1g --cpus=1.5 kwenye mstari wa amri, au funguo zinazolingana katika faili la Compose. Ikiwa tayari unahifadhi stack yako katika faili la Docker Compose kwenye VPS, kikomo hukaa kando ya huduma inayohusika na husafiri nayo ndani ya git.
FreeBSD hutumia rctl, na ni mfumo mdogo ambao lazima uuwashe. Uhasibu wa rasilimali umezimwa kwa chaguo-msingi kwa sababu unagharimu kiasi kidogo katika kila ugawaji. Ongeza tunable kwenye /boot/loader.conf na uwashe upya seva:
kern.racct.enable=1Kisha weka sheria na uifuatilie:
sudo rctl -a jail:web:vmemoryuse:deny=1g
rctl -hu jail:webrctl -hu jail:web huchapisha matumizi ya sasa ya jail katika vipimo vinavyosomeka na binadamu, ili uweze kuona jinsi ilivyo karibu na kikomo kabla ya kitu chochote kuharibika. Kitendo cha deny husababisha ugawaji unaozidi kikomo kufeli ndani ya jail, ili uone kosa la ugawaji la programu yenyewe badala ya ujumbe wa kuua mchakato (kill message) kwenye host.
Sheria zilizoongezwa kwa rctl -a hupotea wakati wa reboot inayofuata. Huduma ya rctl ya FreeBSD hupakia upya sheria hizo kutoka /etc/rctl.conf, kwa hivyo andika sheria kwenye faili hilo na uwezeshe huduma hiyo:
sudo sysrc rctl_enable=YESHapa ndipo Docker inapokuwa rahisi zaidi. Kikomo katika faili la Compose hukaguliwa pamoja na huduma inayowekewa vikwazo. Sheria ya rctl ni mstari katika faili tofauti inayotaja jail iliyofafanuliwa mahali pengine.
Wakati jibu ni mashine pepe: bhyve
Jail inashiriki kernel ya mwenyeji (host), kwa hivyo baadhi ya mambo hayawezi kufikiwa kabisa. Haiwezi kuendesha toleo tofauti la kernel, haiwezi kupakia kernel module, na haiwezi kuendesha binaries za Linux kama vile container ya Linux inavyofanya. FreeBSD ina safu ya utangamano wa Linux, inayojulikana kama linuxulator, lakini inatekeleza sehemu ndogo tu ya system calls za Linux na si jibu la jumla kwa images zozote za Linux.
bhyve ni hypervisor ya FreeBSD, na ndiyo zana sahihi unapohitaji mpaka halisi wa mashine: mfumo tofauti wa uendeshaji, kernel tofauti, au mpangaji (tenant) ambaye hutaki kushiriki naye kernel. Unalipa kwa kutumia kumbukumbu (memory) inayotengwa badala ya kushirikiwa, na kwa kernel ya pili ya kuifanyia patching. Hii ni sawa na uamuzi unaofanya kwenye Linux kati ya containers na mashine pepe kamili, na ndio unaoamua kama unahitaji VPS inayounga mkono nested virtualization chini yake.
Mfumo wa ikolojia, ambao ndio sababu ya kweli inayofanya timu nyingi kutumia Docker
Kila kitu hapo juu kinahusu modeli. Kinachoamua chaguo kwa timu nyingi ni ukubwa wa ulimwengu unaozunguka kila moja.
Docker huleta Docker Hub na GHCR, docker compose, Kubernetes wakati seva moja inapoacha kutosheleza, CI runners zenye usaidizi wa container uliounganishwa tayari, na mwongozo wa kuanza haraka kwa amri moja katika karibu kila README ya mradi. Jails huleta FreeBSD ports tree, ambayo ni kubwa na inayotunzwa kwa uangalifu, pamoja na seti ndogo zaidi ya vifurushi vya programu vilivyo tayari kuendeshwa. Wakati mradi unapochapisha container image na si kitu kingine, njia ya FreeBSD ni kusoma nyaraka zake na kukusanya sehemu hizo wewe mwenyewe.
Jails hujipatia nafasi yake kwa upande mwingine wa biashara hiyo. Unazihitaji wakati tayari unatumia ZFS na unathamini snapshot na rollback ya huduma nzima, wakati huduma zako ni za asili za FreeBSD, wakati unataka full userland kwa kila mpangaji badala ya mchakato mmoja, au wakati unataka kernel, packet filter, filesystem na nyaraka zitunzwe pamoja kama mfumo mmoja. Hoja hiyo ya mwisho ndiyo watu wanayomaanisha wanapoiita FreeBSD kuwa na mshikamano, na inapata nafasi zaidi katika ulinganisho mpana zaidi wa Linux na FreeBSD kama majukwaa ya seva na katika yale ambayo FreeBSD 15 ilibadilisha kwa matumizi ya seva.
Uamuzi wa mwisho. Ikiwa timu yako tayari inajua Docker, gharama ya kuhama ni ya kweli na faida lazima iwe mahususi. Usihame kwa ajili ya ubora wa isolation; modeli hizi mbili ziko karibu kiasi kwamba usanidi wako una umuhimu zaidi. Hama kwa sababu unataka rollback inayotumia ZFS ya huduma nzima, au kwa sababu tayari uko kwenye FreeBSD.
FAQ
Je, ninaweza kuendesha Docker images kwenye FreeBSD?
Sio Linux images, na sio kama njia inayoungwa mkono rasmi. FreeBSD ina usaidizi wa OCI container: sudo pkg install -y podman-suite husakinisha Podman, inayotumia containers kupitia ocijail, runtime inayounda jails halisi chini yake. Inahitaji fdescfs kuwekwa kwenye /dev/fd kwa ajili ya mfuatiliaji wa container, na pf kwa ajili ya NAT (network address translation) ya container. OCI images za asili za FreeBSD hufanya kazi vizuri zaidi. Linux images zinahitaji ziada ya Linux compatibility layer, na kufikia Agosti 2026, port ya Podman ya FreeBSD bado inaelezewa kama ya majaribio. Ikiwa deployment yako ni mkusanyiko wa Linux images, iendeshe kwenye Linux.
Je, FreeBSD jails ni salama zaidi kuliko Docker containers?
Zote hushiriki kernel moja ya seva, kwa hivyo hitilafu ya kernel ni hatari kwa zote, na hakuna kati yao iliyo na mipaka unayoweza kuchagua kwa ajili ya code isiyoaminika kabisa. Tofauti iko kwenye hatua ya kuanzia. Jail huanza na seti pana ya shughuli zilizokataliwa na unaziwezesha tena kigezo kimoja baada ya kingine. Docker container huanza kama root ndani ya seti ya namespaces huku baadhi ya capabilities zikiwa zimeondolewa, na uimarishaji zaidi ni wa hiari. Kwa vitendo, usanidi huamua zaidi kuliko mfano wenyewe: jail inayoendeshwa na allow.mount na allow.raw_sockets zikiwa zimewezeshwa si salama zaidi kuliko container iliyosanidiwa kwa uangalifu.
Ninafanyaje backup ya jail?
Chukua snapshot ya dataset na uitume. sudo zfs snapshot zroot/jails/containers/web@backup, kisha zfs send snapshot hiyo kwenye pool nyingine au kwenye faili unayohamisha kutoka kwenye seva. Kwa sababu jail huweka userland yake yote kwenye dataset moja, snapshot hunasa vifurushi vilivyosakinishwa na data katika hatua moja thabiti, pamoja na kila faili ya usanidi uliyohariri kwa mkono. Hiyo ni kinyume na mazoea ya Docker, ambapo unafanya backup ya named volumes na faili ya Compose na kujenga upya sehemu nyingine kutoka kwenye image.
Je, ninahitaji BastilleBSD, au mfumo wa msingi (base system) unatosha?
Mfumo wa msingi unatosha, na ndio mahali pazuri pa kuanzia. jail.conf, jls, jexec na service jail start hufunika mfano mzima, na ukishazijua unaweza kusoma seva yoyote ya FreeBSD bila kujifunza zana za seva hiyo kwanza. Bastille ni safu ya urahisi juu yake: huanzisha releases, huunda thin jails, hutumia templates na kukuandikia sheria za uelekezaji za pf. Jifunze amri za msingi kwanza, kisha ongeza Bastille wakati idadi ya jails inapofanya uandishi kuwa wa kuchosha.