SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Perbezaan FreeBSD Jails vs Docker Containers

Ketahui perbezaan utama antara FreeBSD Jails dan Docker. Jails mengasingkan keseluruhan userland manakala Docker menggunakan imej berlapis untuk menjalankan 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 satu 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 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 setiap 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 tiada maklumat di bawah merupakan 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 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 mengikat (bind) pada alamat rangkaian yang tidak diberikan kepada jail tersebut. Tiada jenis ruang nama (namespace) berasingan untuk dipelajari dan tiada pilihan ikut-ciri (per-feature opt-in): sekatan tersebut hadir sebagai satu unit, yang dilaraskan oleh parameter dalam konfigurasi jail.

Pada hos, jls menyenaraikan jail yang sedang berjalan dan jexec web sh membawa anda masuk 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/web

Perintah tersebut mengambil set pengedaran asas untuk keluaran anda dan menjalankan langkah pasca-pemasangan biasa, jadi anda menetapkan kata laluan root dan memilih zon waktu sama seperti yang anda lakukan pada pelayan baharu. Hasilnya ialah pemasangan FreeBSD yang terletak di dalam satu folder. Anda kemudian memerihalkannya 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
jls

jls kini sepatutnya menyenaraikan web dengan JID, nama hos, 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 diterimanya, 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 tersebut dan berhenti apabila proses itu berhenti.

Cara anda memasukkan 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 memasang perisian 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-RELEASE

bastille 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 web

bastille 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 jujurnya adalah pendek. 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 tersebut 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 merupakan ciri jika anda mengikut peraturan, tetapi 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-upgrade

Semak 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 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 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 install

Thin 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 ini, yang juga merupakan cara port kontena yang diterbitkan melangkau ufw secara terus.

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: socket 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 akan mendapat stack rangkaian penuh: antara muka sendiri, jadual routing 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 redirect pf. Bastille membungkusnya:

sudo bastille rdr web tcp 80 80

Tiada EXPOSE dan tiada penerbitan automatik. Tiada apa-apa yang boleh mencapai jail melainkan alamatnya atau peraturan redirect 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 tindanan 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 melibatkan sedikit kos pada setiap peruntukan. Tambahkan tunable ke dalam /boot/loader.conf dan but semula:

kern.racct.enable=1

Kemudian tetapkan peraturan dan pantau:

sudo rctl -a jail:web:vmemoryuse:deny=1g
rctl -hu jail:web

rctl -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 pada FreeBSD memuatkan semula peraturan tersebut daripada /etc/rctl.conf, jadi tulis peraturan ke dalam fail tersebut dan aktifkan servis:

sudo sysrc rctl_enable=YES

Ini 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 (patch). 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, yang merupakan sebab jujur 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 tersedia, dan permulaan pantas satu arahan dalam hampir setiap README projek. Jails membawa FreeBSD ports tree, yang besar dan diselenggara dengan teliti, serta set himpunan 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 snapshot serta rollback 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 hasilnya mestilah khusus. Jangan bertukar demi kualiti pengasingan; kedua-dua model adalah cukup hampir sehingga konfigurasi anda lebih penting. Bertukarlah kerana anda mahukan rollback keseluruhan servis yang disokong oleh ZFS, 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 yang dilekapkan pada /dev/fd untuk pemantau 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.

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 pada satu masa. Kontena Docker bermula sebagai root di dalam set namespace dengan beberapa keupayaan digugurkan, dan pengukuhan lanjut adalah pilihan (opt-in). Secara praktikalnya, konfigurasi lebih menentukan daripada 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 mesin tersebut. Kerana jail menyimpan keseluruhan userland 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 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 dahulu, kemudian tambahkan Bastille apabila bilangan jail menjadikan proses menaip terlalu membebankan.