Perbezaan FreeBSD Jails vs Docker Containers
Ketahui perbezaan utama antara FreeBSD Jails dan Docker. Jails mengasingkan keseluruhan userland manakala Docker menggunakan imej berlapis untuk proses tunggal anda.
Perbandingan FreeBSD jails dan Docker containers dalam satu perenggan
FreeBSD jails dan Docker containers menyelesaikan masalah yang sama dengan pendekatan yang berbeza. Kedua-duanya menjalankan userland terasing pada kernel yang dikongsi, jadi tiada satu pun daripadanya merupakan mesin maya. Perbezaannya terletak pada kandungan di dalamnya. Docker container menjalankan satu proses daripada imej berlapis yang ditarik daripada registry. Jail pula menjalankan userland FreeBSD yang lengkap: /etc sendiri, skrip permulaan rc sendiri, pangkalan data pkg sendiri, serta seberapa banyak proses yang anda mahukan. Hampir semua perbezaan lain dalam halaman ini berpunca daripada perkara tersebut.
SSD Nodes tidak menawarkan imej FreeBSD. Anda tidak boleh menyewa pelayan FreeBSD pada platform ini, dan maklumat di bawah bukanlah panduan pemasangan untuk mesin yang boleh anda beli di sini. Ini adalah perbandingan dua model pengasingan, ditulis supaya anda boleh menentukan model mana yang sebenarnya diperlukan oleh beban kerja anda, dan supaya anda boleh membaca persediaan pasukan FreeBSD tanpa perlu meneka.
Apakah sebenarnya jail itu
Jail diperkenalkan dalam FreeBSD 4.0 pada Mac 2000, menjadikannya lebih lama daripada cgroups dan kira-kira sedekad lebih tua daripada Docker. Mekanismenya adalah satu panggilan kernel. jail(8) mengambil satu pepohon direktori dan memulakan proses di dalamnya dengan ID jail yang dilampirkan, kemudian kernel akan menolak set operasi tetap bagi mana-mana proses yang membawa ID tersebut. Proses yang berada dalam jail tidak boleh melihat proses di luar jailnya, tidak boleh melakukan mount atau unmount sistem fail, tidak boleh memuatkan modul kernel, dan tidak boleh bind pada alamat rangkaian yang tidak diberikan kepada jail tersebut. Tiada jenis namespace berasingan untuk dipelajari dan tiada pilihan ikut ciri: sekatan tersebut hadir sebagai satu unit, yang dilaraskan melalui parameter dalam konfigurasi jail.
Pada hos, jls menyenaraikan jail yang sedang berjalan dan jexec web sh membawa anda ke dalam shell di dalam jail yang bernama web.
Anda membina jail dengan meletakkan userland FreeBSD ke dalam satu direktori. Sistem asas melakukan perkara itu untuk anda:
sudo bsdinstall jail /usr/local/jails/containers/webPerintah tersebut mengambil set pengedaran asas untuk keluaran anda dan menjalankan langkah pasca-pemasangan biasa, jadi anda menetapkan kata laluan root dan memilih zon masa seperti yang anda lakukan pada pelayan baharu. Hasilnya ialah pemasangan FreeBSD yang berada di dalam satu folder. Anda kemudian menerangkannya dalam /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;
}Mulakannya, kemudian semak:
sudo service jail start web
jlsjls kini sepatutnya menyenaraikan web dengan JID, hostname dan alamat IPnya. Jika jail tidak muncul, jalankan sudo jail -c web secara terus. Ia menggunakan konfigurasi yang sama di latar depan dan mencetak parameter yang tidak dapat diterima, bukannya membiarkan kegagalan tersebut dalam output servis.
Baris yang perlu dibaca dua kali ialah exec.start = "/bin/sh /etc/rc". Memulakan jail akan menjalankan skrip but biasa FreeBSD di dalamnya, jadi jail tersebut akan menghidupkan setiap servis yang didayakan dalam /etc/rc.conf miliknya sendiri. Kontena Docker tidak mempunyai langkah yang setara, kerana ia menjalankan proses entrypoint imej dan berhenti apabila proses tersebut berhenti.
Cara anda mendapatkan perisian: imej dan registri berbanding userland yang anda isi sendiri
Ini adalah perbezaan yang anda rasai pada hari pertama.
Dengan Docker, anda menamakan perisian dan menerimanya. docker pull nginx mengambil imej berlapis yang dialamatkan mengikut kandungan yang dibina dan diuji oleh orang lain, dan docker compose up -d memulakannya dengan volume serta rangkaian yang dilampirkan. Registri adalah produknya. Kebanyakan nilai dalam aliran kerja Docker ialah ribuan projek menerbitkan imej yang berfungsi, yang menjadikan menjalankan Docker pada VPS satu tugas singkat dan bukannya satu projek besar.
FreeBSD tidak menyediakan registri awam lalai untuk imej jail. Anda mencipta userland kosong dan melakukan pemasangan ke dalamnya, sama seperti cara anda menyediakan pelayan kosong (bare server). Ini memerlukan lebih banyak penaipan. Ia juga lebih telus, kerana apa yang berjalan di dalam jail adalah apa yang diletakkan oleh pkg di sana, daripada set pakej yang sama yang digunakan oleh hos.
Alatan menjadikan proses ini singkat. BastilleBSD ialah pengurus jail yang biasa digunakan dan ia merupakan satu pakej:
sudo pkg install bastille
sudo sysrc bastille_enable=YES
sudo bastille setup
sudo bastille bootstrap 15.1-RELEASEbastille setup mengkonfigurasi rangkaian, storan dan firewall untuk anda. bastille bootstrap memuat turun satu release sekali sahaja, dan setiap jail yang anda cipta selepas itu akan menggunakannya semula. FreeBSD 15.1 ialah release pengeluaran semasa, yang dikeluarkan pada Jun 2026; gantikan dengan mana-mana release yang anda jalankan.
Mencipta jail kemudiannya hanya memerlukan satu arahan, dan mengisinya memerlukan satu lagi:
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 memberikan anda shell log masuk di dalam jail, dan bastille list menunjukkan apa yang wujud pada hos. Untuk mengulangi binaan, templat Bastille menyimpan langkah-langkah dalam satu fail dan mengaplikasikannya pada jail, yang merupakan perkara paling hampir dengan Dockerfile dalam dunia ini. Templat dimainkan semula pada setiap jail. Tiada apa-apa yang tiba dalam keadaan pra-bina.
Jadi, ringkasan jujurnya adalah pendek. Docker memberikan anda binaan orang lain. Jail memberikan anda pemasangan anda sendiri. Jika perisian dalam senarai pendek anda diedarkan sebagai imej kontena dan tiada format lain, itu menyelesaikan persoalan tersebut sebelum faktor lain diambil kira.
Keadaan dan naik taraf: bahagian perubahan ZFS
Docker memisahkan keadaan secara sengaja. Sistem fail kontena bersifat sementara, data anda disimpan dalam volume bernama atau bind mount, dan naik taraf dilakukan dengan docker compose pull diikuti oleh docker compose up -d. Kontena tersebut diganti, dan apa-apa yang tidak diletakkan dalam volume akan hilang. Ini merupakan ciri jika anda mengikut peraturan, namun menjadi insiden kehilangan data jika anda terlupa, itulah sebabnya pilihan antara bind mount dan volume bernama sangat penting dalam stack Compose.
Jail tidak memisahkan keadaan, dan ZFS adalah sebab mengapa ia berfungsi. Keseluruhan jail adalah satu dataset:
sudo zfs snapshot zroot/jails/containers/web@pre-upgrade
sudo pkg -j web upgrade
sudo zfs rollback zroot/jails/containers/web@pre-upgradeSemak nama dataset sebenar dengan zfs list sebelum anda menjalankan arahan ini; laluan di atas adalah susun atur yang digunakan oleh buku panduan. Snapshot mengambil masa kira-kira satu saat dan hampir tidak menggunakan ruang sehingga kandungan jail berubah. Jika naik taraf merosakkan servis, rollback akan mengembalikan keseluruhan userland kepada keadaan sebelumnya, termasuk pangkalan data pakej dan fail konfigurasi yang anda sunting secara manual pada pukul 2 pagi. Docker tidak mempunyai padanan terbina dalam, kerana modelnya mengandaikan anda tidak pernah memerlukannya.
zfs clone adalah bahagian yang selebihnya. Clone daripada snapshot ialah jail baharu yang boleh ditulis yang berkongsi blok yang tidak berubah dengan induknya, jadi salinan staging bagi jail bersaiz 3 GB hampir tidak memakan ruang cakera sehingga anda mula mengubahnya. Begitulah cara pentadbir FreeBSD membina jail yang "sama seperti pengeluaran" untuk menguji naik taraf.
Naik taraf sistem asas adalah berasingan daripada pakej. Bagi jail yang memegang salinan userlandnya sendiri:
sudo freebsd-update -b /usr/local/jails/containers/web fetch installThin jail mengelakkan pengulangan kerja tersebut. Ia melekapkan satu asas baca-sahaja yang dikongsi melalui nullfs dan memberikan setiap jail lapisan boleh tulis yang kecil, jadi anda menampal (patch) asas tersebut sekali dan setiap jail akan melihat hasilnya. Bastille mencipta thin jail secara lalai.
Rangkaian: port yang diterbitkan berbanding keputusan pengalamatan
Docker menentukan rangkaian untuk anda dan meminta anda menerbitkan pengecualian. Kontena diletakkan pada bridge, ia berhubung antara satu sama lain melalui nama servis pada rangkaian yang ditentukan pengguna, dan -p 8080:80 mendedahkan salah satu daripadanya kepada hos. Docker menulis peraturan penapis paketnya sendiri untuk merealisasikan perkara tersebut, yang juga merupakan cara port kontena yang diterbitkan melangkau ufw secara terus.
Jail memaksa anda memilih model di peringkat awal, dan terdapat dua model.
IP Berkongsi. ip4.addr = "10.0.0.10" menambah alamat tersebut pada antara muka hos sedia ada dan mengehadkan jail kepadanya. Jail tidak mempunyai stack rangkaiannya sendiri, jadi ia tidak boleh menjalankan firewall sendiri. Ia juga tidak boleh benar-benar bind kepada setiap alamat: soket dalam jail yang meminta 0.0.0.0 akan ditulis semula oleh kernel kepada alamat jail itu sendiri. Dua jail tidak boleh mendengar pada port 80 bagi alamat yang sama, jadi anda perlu memberikan setiap satu alamat, atau anda meletakkan reverse proxy di hadapan.
VNET. Tambahkan vnet; pada jail dan ia mendapat stack rangkaian penuh: antara muka sendiri, jadual penghalaan sendiri, dan peraturan firewall sendiri. Anda menyambungkannya kepada hos dengan epair, iaitu kabel maya dengan satu hujung pada setiap sisi, dan meletakkan hujung hos pada bridge. Ini adalah padanan paling hampir dengan apa yang diberikan oleh Docker kepada anda, dan ia merupakan mod di sebalik jenis jail -V dan -B dalam Bastille.
Menghalakan port hos ke dalam jail adalah peraturan ubah hala pf. Bastille membungkusnya:
sudo bastille rdr web tcp 80 80Tiada EXPOSE dan tiada penerbitan automatik. Tiada apa-apa yang sampai ke jail melainkan alamatnya atau peraturan ubah hala membenarkannya. Ini merupakan permulaan yang lebih perlahan dan firewall yang jauh lebih senyap.
Had sumber: cgroups lwn rctl
Docker mengehadkan kontena menggunakan cgroups, dan had tersebut terletak di tempat kontena ditakrifkan: --memory=1g --cpus=1.5 pada baris perintah, atau kunci yang sepadan dalam fail Compose. Jika anda sudah menyimpan stack anda dalam fail Docker Compose pada VPS, had tersebut terletak bersebelahan dengan servis yang dikenakan dan bergerak bersamanya dalam git.
FreeBSD menggunakan rctl, dan ia merupakan subsistem yang perlu anda aktifkan. Perakaunan sumber dimatikan secara lalai kerana ia memakan sedikit kos pada setiap peruntukan. Tambahkan tunable tersebut ke dalam /boot/loader.conf dan but semula:
kern.racct.enable=1Kemudian tetapkan peraturan dan pantau ia:
sudo rctl -a jail:web:vmemoryuse:deny=1g
rctl -hu jail:webrctl -hu jail:web mencetak penggunaan semasa jail dalam unit yang boleh dibaca manusia, supaya anda boleh melihat sejauh mana ia hampir dengan had sebelum sebarang kerosakan berlaku. Tindakan deny menyebabkan peruntukan yang melebihi had gagal di dalam jail, supaya anda melihat ralat peruntukan aplikasi itu sendiri dan bukannya mesej kill pada hos.
Peraturan yang ditambah dengan rctl -a akan hilang pada but semula seterusnya. Servis rctl FreeBSD memuatkan semula peraturan tersebut daripada /etc/rctl.conf, jadi tulis peraturan tersebut ke dalam fail itu dan aktifkan servis tersebut:
sudo sysrc rctl_enable=YESIni adalah paksi di mana Docker jelas lebih mudah. Had dalam fail Compose disemak bersama servis yang dihadkannya. Peraturan rctl pula merupakan satu baris dalam fail berasingan yang menamakan jail yang ditakrifkan di tempat lain.
Apabila jawapannya ialah mesin maya: bhyve
Jail berkongsi kernel hos, jadi beberapa perkara tidak dapat dicapai secara kekal. Ia tidak boleh menjalankan versi kernel yang berbeza, ia tidak boleh memuatkan modul kernel, dan ia tidak boleh menjalankan binari Linux seperti yang dilakukan oleh kontena Linux. FreeBSD mempunyai lapisan keserasian Linux, iaitu linuxulator, tetapi ia hanya melaksanakan subset panggilan sistem Linux dan ia bukan jawapan umum untuk imej Linux sebarangan.
bhyve ialah hypervisor FreeBSD, dan ia merupakan alat yang tepat apabila anda memerlukan sempadan mesin yang sebenar: sistem pengendalian yang berbeza, kernel yang berbeza, atau penyewa yang anda lebih suka untuk tidak berkongsi kernel dengannya. Anda perlu membayar dengan memori yang dikhaskan dan bukannya dikongsi, serta kernel kedua untuk ditampal. Ini adalah keputusan yang sama yang anda buat pada Linux antara kontena dan mesin maya penuh, dan ia adalah keputusan yang menentukan sama ada anda memerlukan VPS yang menyokong virtualisasi bersarang di bawahnya.
Ekosistem, sebab utama mengapa kebanyakan pasukan menggunakan Docker
Segala perkara di atas adalah mengenai model. Perkara yang menentukan pilihan bagi kebanyakan pasukan ialah saiz dunia di sekeliling setiap satu.
Docker membawa Docker Hub dan GHCR, docker compose, Kubernetes apabila satu pelayan tidak lagi mencukupi, CI runner dengan sokongan kontena yang sudah tersedia, serta arahan permulaan pantas dalam hampir setiap README projek. Jails membawa FreeBSD ports tree, yang besar dan diselenggara dengan teliti, serta set pakej aplikasi sedia untuk dijalankan yang jauh lebih kecil. Apabila sesuatu projek menerbitkan imej kontena dan tiada yang lain, laluan FreeBSD adalah dengan membaca dokumentasinya dan memasang komponen tersebut sendiri.
Jails mendapat tempatnya di sebalik pertukaran tersebut. Anda memerlukannya apabila anda sudah menjalankan ZFS dan menghargai keupayaan snapshot serta rollback bagi keseluruhan servis, apabila servis anda adalah natif FreeBSD, apabila anda mahukan userland penuh bagi setiap penyewa dan bukannya satu proses tunggal, atau apabila anda mahukan kernel, packet filter, sistem fail dan dokumentasi diselenggara bersama sebagai satu sistem. Perkara terakhir itulah yang dimaksudkan apabila orang memanggil FreeBSD sebagai koheren, dan ia mendapat lebih banyak ruang dalam perbandingan lebih luas antara Linux dan FreeBSD sebagai platform pelayan serta dalam perubahan FreeBSD 15 untuk kegunaan pelayan.
Satu pertimbangan penutup. Jika pasukan anda sudah mahir dengan Docker, kos untuk berpindah adalah nyata dan ganjaran yang diperoleh mestilah spesifik. Jangan bertukar hanya kerana kualiti pengasingan; kedua-dua model adalah cukup hampir sehingga konfigurasi anda lebih penting. Bertukarlah kerana anda mahukan rollback berasaskan ZFS bagi keseluruhan servis, atau kerana anda memang sudah menggunakan FreeBSD.
FAQ
Bolehkah saya menjalankan imej Docker pada FreeBSD?
Bukan imej Linux, dan bukan sebagai laluan yang disokong. FreeBSD mempunyai sokongan kontena OCI: sudo pkg install -y podman-suite memasang Podman, yang menjalankan kontena melalui ocijail, iaitu runtime yang mencipta jail sebenar di bawahnya. Ia memerlukan fdescfs dipasang pada /dev/fd untuk monitor kontena, dan pf untuk NAT (network address translation) kontena. Imej OCI asli FreeBSD berfungsi dengan paling baik. Imej Linux memerlukan lapisan keserasian Linux tambahan, dan sehingga Ogos 2026, port Podman FreeBSD masih disifatkan sebagai eksperimental. Jika deployment anda terdiri daripada himpunan imej Linux, jalankannya pada Linux. Bagi keluarga RHEL, ini bermakna memasang Docker pada Rocky Linux atau AlmaLinux, di mana Podman muncul buat kali kedua sebagai pakej yang sudah memiliki arahan docker sebelum anda memasang apa-apa.
Adakah jail FreeBSD lebih selamat daripada kontena Docker?
Kedua-duanya berkongsi satu kernel hos, jadi pepijat kernel merupakan risiko kepada kedua-duanya, dan tiada satu pun yang menjadi sempadan yang anda akan pilih untuk kod yang benar-benar tidak dipercayai. Perbezaannya terletak pada titik permulaan. Jail bermula dengan set operasi yang luas ditolak dan anda mendayakannya semula satu parameter demi satu parameter. Kontena Docker bermula sebagai root di dalam set namespace dengan beberapa keupayaan digugurkan, dan pengukuhan lanjut adalah pilihan (opt-in). Secara praktikal, konfigurasi menentukan lebih banyak perkara berbanding model: jail yang dijalankan dengan allow.mount dan allow.raw_sockets didayakan tidak lebih selamat daripada kontena yang dikonfigurasikan dengan teliti.
Bagaimanakah cara saya membuat sandaran (backup) jail?
Ambil snapshot dataset dan hantarkannya. sudo zfs snapshot zroot/jails/containers/web@backup, kemudian zfs send snapshot tersebut ke pool lain atau ke dalam fail yang anda salin keluar dari kotak tersebut. Kerana jail menyimpan keseluruhan userland-nya dalam satu dataset, snapshot tersebut menangkap pakej yang dipasang dan data pada satu titik yang konsisten, bersama-sama dengan setiap fail konfigurasi yang anda sunting secara manual. Ini bertentangan dengan tabiat Docker, di mana anda membuat sandaran pada named volumes dan fail Compose, kemudian membina semula bahagian lain daripada imej.
Adakah saya memerlukan BastilleBSD, atau sistem asas sudah mencukupi?
Sistem asas sudah mencukupi, dan ia merupakan tempat yang lebih baik untuk bermula. jail.conf, jls, jexec dan service jail start merangkumi keseluruhan model, dan sebaik sahaja anda memahaminya, anda boleh membaca mana-mana hos FreeBSD tanpa perlu mempelajari peralatan hos tersebut terlebih dahulu. Bastille ialah lapisan kemudahan di atasnya: ia melakukan bootstrap release, mencipta thin jail, menggunakan templat dan menulis peraturan ubah hala pf untuk anda. Pelajari arahan asas terlebih dahulu, kemudian tambahkan Bastille apabila bilangan jail menjadikan proses menaip menjadi membosankan.