Perbezaan FreeBSD Jails vs Docker Containers
Ketahui perbezaan teknikal antara FreeBSD Jails dan Docker. Jails mengasingkan keseluruhan userland manakala Docker menggunakan imej berlapis untuk proses tunggal.
Perbandingan FreeBSD jails dan Docker containers dalam satu perenggan
FreeBSD jails dan Docker containers menyelesaikan masalah yang sama dalam bentuk yang berbeza. Kedua-duanya menjalankan userland terasing pada kernel yang dikongsi, jadi tiada satu pun daripadanya merupakan mesin maya (virtual machine). Perbezaannya terletak pada kandungan di dalamnya. Docker container menjalankan satu proses daripada imej berlapis yang anda tarik daripada registry. Jail pula menjalankan userland FreeBSD yang lengkap: /etc sendiri, skrip permulaan rc sendiri, pangkalan data pkg sendiri, dan seberapa banyak proses yang anda mahukan. Hampir semua perbezaan lain pada 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 lama daripada Docker. Mekanismenya adalah satu panggilan kernel. jail(8) mengambil 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 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 melakukan 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, dilaraskan oleh 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 dinamakan 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 itu mengambil set pengedaran asas untuk release anda dan menjalankan kebanyakan langkah pasca-pemasangan biasa, jadi anda menetapkan kata laluan root, memilih servis dan menambah pengguna seperti yang anda lakukan pada pelayan baharu. Ia tidak pernah meminta zon waktu: pemasang menyalin /etc/localtime hos ke dalam jail, jadi jail mewarisi zon waktu hos. 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 sepatutnya kini 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. Bekas Docker tidak mempunyai langkah yang setara, kerana ia menjalankan proses entrypoint imej dan berhenti apabila proses tersebut berhenti.
Cara 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 pkg letakkan 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 release yang anda jalankan.
Mencipta jail kemudiannya hanya memerlukan satu arahan, dan mengisinya memerlukan satu lagi arahan:
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. Satu templat dimainkan semula pada setiap jail. Tiada apa-apa yang tiba dalam keadaan pra-bina.
Jadi, ringkasan yang jujur adalah singkat. Docker memberikan anda binaan orang lain. Jail memberikan anda pemasangan anda sendiri. Jika perisian dalam senarai pendek anda hanya diedarkan sebagai imej kontena dan tiada format lain, itu sudah menyelesaikan persoalan sebelum faktor lain dipertimbangkan.
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 anda letakkan dalam volume akan hilang. Ini adalah ciri jika anda mengikut peraturan, dan insiden kehilangan data jika anda terlupa, itulah sebabnya pilihan antara bind mount dan volume bernama membawa beban yang besar dalam tindanan 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 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 mengembalikan keseluruhan userland kepada keadaan sebelumnya, termasuk pangkalan data pakej dan fail konfigurasi yang anda edit secara manual pada pukul 2 pagi. Docker tidak mempunyai padanan terbina dalam, kerana modelnya mengandaikan anda tidak pernah menginginkannya.
zfs clone adalah separuh lagi. 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 menelan kos pada cakera sehingga anda mula mengubahnya. Begitulah cara pentadbir FreeBSD membina jail "sama seperti pengeluaran" untuk membuat latihan 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 kecilnya sendiri, jadi anda menampal asas tersebut sekali dan setiap jail 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 terus memintas ufw.
Jail memaksa anda memilih model di peringkat awal, dan terdapat dua model.
Shared IP. ip4.addr = "10.0.0.10" menambah alamat tersebut pada antara muka hos sedia ada dan mengehadkan jail kepadanya. Jail tidak mempunyai stack rangkaian sendiri, jadi ia tidak boleh menjalankan firewall sendiri. Ia juga tidak boleh benar-benar bind pada setiap alamat: soket dalam jail yang meminta 0.0.0.0 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 ke 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 boleh mencapai jail melainkan alamatnya atau peraturan ubah hala membenarkannya. Ini merupakan permulaan yang lebih perlahan dan firewall yang jauh lebih senyap.
Had sumber: cgroups lawan rctl
Docker mengehadkan bekas menggunakan cgroups, dan had tersebut wujud di tempat bekas itu 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 /boot/loader.conf dan but semula:
kern.racct.enable=1Kemudian tetapkan peraturan dan pantau:
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 kegagalan berlaku. Tindakan deny menyebabkan peruntukan yang melebihi had gagal di dalam jail, supaya anda melihat ralat peruntukan aplikasi itu sendiri dan bukannya mesej penamatan (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 ke dalam fail tersebut dan aktifkan servis:
sudo sysrc rctl_enable=YESIni adalah aspek 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 tidak mahu 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, iaitu sebab jujur mengapa kebanyakan pasukan menggunakan Docker
Segala perkara di atas adalah mengenai modelnya. 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 kotak tidak lagi mencukupi, CI runner dengan sokongan kontena yang sudah sedia terpasang, dan permulaan pantas satu arahan 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 bahagian-bahagian tersebut sendiri.
Jails memperoleh tempatnya di sisi lain pertukaran itu. Anda mahukannya 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 oleh orang ramai apabila mereka memanggil FreeBSD sebagai koheren, dan ia mendapat lebih banyak ruang dalam perbandingan lebih luas antara Linux dan FreeBSD sebagai platform pelayan dan dalam apa yang diubah oleh FreeBSD 15 untuk kegunaan pelayan.
Satu pertimbangan penutup. Jika pasukan anda sudah mengetahui Docker, kos untuk berpindah adalah nyata dan ganjaran yang diperoleh mestilah khusus. Jangan bertukar hanya untuk 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 sudah pun menggunakan FreeBSD.
FAQ
Bolehkah saya menjalankan imej Docker pada FreeBSD?
Bukan imej Linux, dan ia bukan 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 pemantau kontena, dan pf untuk NAT (network address translation) kontena. Imej OCI natif FreeBSD berfungsi dengan paling baik. Imej Linux memerlukan lapisan keserasian Linux tambahan, dan setakat Oktober 2026, mesej pemasangan port Podman FreeBSD sendiri masih menyifatkannya sebagai eksperimental dan bertujuan untuk penilaian serta ujian. 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 daripadanya merupakan 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 pada satu masa. Kontena Docker bermula sebagai root di dalam set namespace dengan beberapa keupayaan digugurkan, dan pengerasan lanjut adalah pilihan (opt-in). Secara praktikalnya, konfigurasi menentukan lebih banyak perkara berbanding model: jail yang berjalan 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 mesin 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 kebiasaan 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 kerja menaip menjadi membosankan.