SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

FreeBSD Jail vs Docker: Apa Perbedaannya?

Bandingkan jail FreeBSD yang memuat userland lengkap dengan Docker yang memakai image berlapis dari registry, termasuk software, state, jaringan, dan batasannya.

FreeBSD jail vs container Docker, dalam satu paragraf

FreeBSD jail dan container Docker menyelesaikan masalah yang sama dengan dua bentuk yang berbeda. Keduanya menjalankan userland yang terisolasi pada satu kernel bersama, sehingga keduanya bukan mesin virtual. Perbedaannya terletak pada isi lingkungan tersebut. Container Docker menjalankan satu proses dari image berlapis yang Anda ambil dari registry. Jail menjalankan userland FreeBSD yang lengkap: /etc sendiri, skrip startup rc sendiri, database pkg sendiri, serta sebanyak mungkin proses yang Anda perlukan. Hampir semua perbedaan lain di halaman ini berasal dari satu hal tersebut.

SSD Nodes tidak menyediakan image FreeBSD. Anda tidak dapat menyewa server FreeBSD pada platform ini, dan tidak ada bagian di bawah ini yang merupakan panduan instalasi untuk mesin yang dapat Anda beli di sini. Ini adalah perbandingan dua model isolasi, yang ditulis agar Anda dapat menentukan model yang benar-benar dibutuhkan suatu workload dan membaca konfigurasi tim FreeBSD tanpa menerka-nerka.

Jail sebenarnya adalah apa

Jail hadir di FreeBSD 4.0 pada March 2000. Ini membuatnya lebih tua daripada cgroups dan sekitar satu dekade lebih tua daripada Docker. Mekanismenya menggunakan satu pemanggilan kernel. jail(8) mengambil pohon direktori dan memulai proses di dalamnya dengan ID jail. Kernel kemudian menolak sekumpulan operasi tertentu untuk setiap proses yang memiliki ID tersebut. Proses di dalam jail tidak dapat melihat proses di luar jail, memasang atau melepas filesystem, memuat modul kernel, atau melakukan bind ke alamat jaringan yang tidak diberikan kepada jail. Tidak ada jenis namespace terpisah yang perlu dipelajari dan tidak ada opt-in per fitur. Pembatasan diterapkan sebagai satu kesatuan dan disesuaikan melalui parameter dalam konfigurasi jail.

Pada host, jls menampilkan jail yang sedang berjalan. jexec web sh membuka shell di dalam jail yang bernama web.

Anda membuat jail dengan menempatkan userland FreeBSD ke dalam sebuah direktori. Base system melakukannya untuk Anda:

sudo bsdinstall jail /usr/local/jails/containers/web

Perintah tersebut mengambil set distribusi base untuk rilis Anda dan menjalankan langkah post-install biasa. Anda menetapkan password root dan memilih timezone seperti saat menyiapkan server baru. Hasilnya adalah instalasi FreeBSD yang berada di dalam sebuah folder. Selanjutnya, jelaskan jail tersebut di /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;
}

Mulai jail tersebut, lalu periksa:

sudo service jail start web
jls

jls sekarang seharusnya menampilkan web beserta JID, hostname, dan alamat IP-nya. Jika jail tidak muncul, jalankan sudo jail -c web secara langsung. Perintah tersebut menerapkan konfigurasi yang sama di foreground dan menampilkan parameter yang tidak dapat diterimanya. Dengan demikian, kegagalan tidak hanya tercatat dalam output service.

Baris yang perlu dibaca dua kali adalah exec.start = "/bin/sh /etc/rc". Memulai jail menjalankan boot script normal FreeBSD di dalamnya. Karena itu, jail memulai setiap service yang diaktifkan dalam /etc/rc.conf miliknya. Container Docker tidak memiliki langkah yang setara. Container tersebut menjalankan proses entrypoint image dan berhenti ketika proses itu berhenti.

Cara memperoleh software: image dan registry dibandingkan dengan userland yang Anda isi sendiri

Inilah perbedaan yang langsung terasa sejak hari pertama.

Dengan Docker, Anda menyebutkan software lalu menerimanya. docker pull nginx mengambil image berlapis dengan alamat berbasis konten yang dibuat dan diuji oleh pihak lain, lalu docker compose up -d menjalankannya dengan volume dan jaringan yang terpasang. Registry adalah inti produknya. Sebagian besar nilai dalam alur kerja Docker berasal dari ribuan proyek yang menerbitkan image siap pakai. Inilah yang membuat menjalankan Docker pada VPS menjadi pekerjaan singkat, bukan sebuah proyek.

FreeBSD tidak menyediakan registry publik default untuk image jail. Anda membuat userland kosong lalu menginstal software ke dalamnya, seperti saat menyiapkan server kosong. Ini memerlukan lebih banyak pengetikan. Namun, prosesnya lebih transparan karena yang berjalan di dalam jail adalah software yang pkg pasang, dari kumpulan package yang sama dengan yang digunakan host.

Tooling membuat proses ini lebih singkat. BastilleBSD adalah jail manager yang umum digunakan dan tersedia sebagai package:

sudo pkg install bastille
sudo sysrc bastille_enable=YES
sudo bastille setup
sudo bastille bootstrap 15.1-RELEASE

bastille setup mengonfigurasi jaringan, storage, dan firewall untuk Anda. bastille bootstrap mengunduh sebuah release satu kali, lalu setiap jail yang dibuat setelahnya menggunakannya kembali. FreeBSD 15.1 adalah production release saat ini dan dirilis pada June 2026; ganti dengan release yang Anda gunakan.

Setelah itu, pembuatan jail hanya memerlukan satu perintah, dan pengisiannya memerlukan satu perintah 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 memberi Anda shell login di dalam jail, sedangkan bastille list menampilkan isi yang tersedia pada host. Untuk mengulangi proses build, template Bastille menyimpan langkah-langkah dalam sebuah file lalu menerapkannya ke jail. Ini adalah hal yang paling mendekati Dockerfile dalam ekosistem ini. Template dijalankan ulang pada setiap jail. Tidak ada yang tersedia dalam kondisi sudah ter-build.

Jadi, kesimpulannya sederhana. Docker memberikan hasil build milik orang lain. Jail memberi Anda instalasi yang Anda buat sendiri. Jika software dalam daftar pilihan Anda tersedia sebagai container image dan tidak dalam bentuk lain, pertanyaan itu sudah terjawab sebelum pertimbangan lain ikut menentukan.

Status dan upgrade: bagian yang diubah ZFS

Docker sengaja memisahkan status. Filesystem container dapat dibuang, sedangkan data Anda berada di named volume atau bind mount, dan upgrade dilakukan dengan docker compose pull lalu docker compose up -d. Container diganti, dan semua data yang tidak Anda simpan dalam volume akan hilang. Ini menjadi fitur jika Anda mengikuti aturan tersebut, tetapi menjadi insiden kehilangan data jika Anda melupakannya. Karena itu, pilihan antara bind mount dan named volume sangat penting dalam stack Compose.

Jail tidak memisahkan status, dan ZFS membuat pendekatan ini dapat berjalan. Seluruh jail merupakan 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

Periksa nama dataset yang sebenarnya dengan zfs list sebelum menjalankan perintah ini. Path di atas adalah susunan yang digunakan handbook. Snapshot selesai dalam waktu sekitar satu detik dan hampir tidak menggunakan ruang sampai isi jail berubah. Jika upgrade merusak service, rollback mengembalikan seluruh userland ke status sebelumnya, termasuk database paket dan file konfigurasi yang Anda edit sendiri pada pukul 2 pagi. Docker tidak memiliki padanan bawaan karena modelnya mengasumsikan bahwa Anda tidak pernah memerlukannya.

zfs clone adalah bagian lainnya. Clone dari snapshot merupakan jail baru yang dapat ditulis dan berbagi blok yang tidak berubah dengan parent-nya. Karena itu, salinan staging dari jail berukuran 3 GB hampir tidak menggunakan ruang disk sampai Anda mulai mengubahnya. Dengan cara ini, admin FreeBSD membuat jail yang "sama seperti production" untuk menguji upgrade.

Upgrade base system terpisah dari paket. Untuk jail yang memiliki salinan userland sendiri:

sudo freebsd-update -b /usr/local/jails/containers/web fetch install

Thin jail menghindari pekerjaan berulang tersebut. Thin jail memasang satu base bersama yang bersifat read-only melalui nullfs dan memberikan setiap jail writable layer kecilnya sendiri. Dengan demikian, Anda cukup memperbarui base satu kali dan setiap jail akan melihat hasilnya. Bastille membuat thin jail secara default.

Jaringan: port yang dipublikasikan vs. keputusan pengalamatan

Docker menentukan jaringan untuk Anda dan meminta Anda memublikasikan pengecualiannya. Container ditempatkan pada bridge, dapat saling menjangkau berdasarkan nama service pada jaringan yang ditentukan pengguna, dan -p 8080:80 mengekspos salah satunya ke host. Docker menulis aturan packet filter miliknya sendiri agar hal itu berfungsi. Mekanisme ini juga yang menyebabkan port container yang dipublikasikan dapat melewati ufw.

Jail mengharuskan Anda memilih model sejak awal. Ada dua model.

Shared IP. ip4.addr = "10.0.0.10" menambahkan alamat tersebut ke interface host yang sudah ada dan membatasi jail agar hanya menggunakannya. Jail tidak memiliki network stack sendiri, sehingga tidak dapat menjalankan firewall sendiri. Jail juga tidak benar-benar dapat melakukan bind ke setiap alamat. Socket dalam jail yang meminta 0.0.0.0 akan ditulis ulang oleh kernel menjadi alamat milik jail tersebut. Dua jail tidak dapat sama-sama listen pada port 80 di alamat yang sama. Karena itu, berikan alamat berbeda untuk masing-masing jail atau tempatkan reverse proxy di depannya.

VNET. Tambahkan vnet; ke jail agar jail memperoleh network stack lengkap: interface sendiri, routing table sendiri, dan aturan firewall sendiri. Hubungkan jail ke host menggunakan epair, yaitu kabel virtual dengan satu ujung di masing-masing sisi, lalu tempatkan ujung pada sisi host ke dalam bridge. Model ini paling mirip dengan yang diberikan Docker. Model ini juga digunakan oleh jenis jail Bastille -V dan -B.

Meneruskan port host ke dalam jail merupakan aturan redirect pf. Bastille membungkusnya:

sudo bastille rdr web tcp 80 80

Tidak ada EXPOSE dan tidak ada publikasi otomatis. Tidak ada koneksi yang dapat mencapai jail kecuali alamatnya atau aturan redirect mengizinkannya. Proses awalnya lebih panjang, tetapi firewall menjadi jauh lebih tenang.

Batas sumber daya: cgroups vs rctl

Docker membatasi container dengan cgroups. Batas tersebut berada di tempat container didefinisikan: --memory=1g --cpus=1.5 pada command line, atau pada key yang sesuai dalam file Compose. Jika stack Anda sudah disimpan dalam file Docker Compose pada VPS, batas tersebut berada di samping service yang menerapkannya dan ikut tersimpan bersamanya di git.

FreeBSD menggunakan rctl. Subsystem ini harus diaktifkan terlebih dahulu. Pencatatan penggunaan sumber daya dinonaktifkan secara default karena menambah sedikit overhead pada setiap alokasi. Tambahkan tunable ke /boot/loader.conf lalu reboot:

kern.racct.enable=1

Selanjutnya, tetapkan aturan dan pantau penggunaannya:

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

rctl -hu jail:web menampilkan penggunaan jail saat ini dalam satuan yang mudah dibaca, sehingga Anda dapat melihat seberapa dekat penggunaannya dengan batas sebelum terjadi kegagalan. Tindakan deny membuat alokasi yang melampaui batas gagal di dalam jail. Dengan demikian, Anda melihat error alokasi dari aplikasi itu sendiri, bukan pesan kill pada host.

Aturan yang ditambahkan dengan rctl -a akan hilang saat reboot berikutnya. Service rctl milik FreeBSD memuat ulang aturan tersebut dari /etc/rctl.conf. Karena itu, tulis aturan ke file tersebut dan aktifkan service:

sudo sysrc rctl_enable=YES

Inilah aspek yang membuat Docker jelas lebih praktis. Batas dalam file Compose ditinjau bersama service yang dibatasinya. Aturan rctl berupa satu baris dalam file terpisah yang menyebutkan jail yang didefinisikan di tempat lain.

Jika jawabannya adalah mesin virtual: bhyve

Jail menggunakan kernel host, sehingga beberapa hal tidak dapat dilakukan. Jail tidak dapat menjalankan versi kernel yang berbeda, memuat modul kernel, atau menjalankan biner Linux seperti yang dilakukan container Linux. FreeBSD memiliki lapisan kompatibilitas Linux, yaitu linuxulator, tetapi lapisan ini hanya mengimplementasikan sebagian system call Linux dan bukan solusi umum untuk sembarang image Linux.

bhyve adalah hypervisor FreeBSD dan merupakan alat yang tepat jika Anda memerlukan batas mesin yang nyata: sistem operasi yang berbeda, kernel yang berbeda, atau tenant yang tidak ingin Anda jalankan pada kernel yang sama. Konsekuensinya adalah kebutuhan memori yang dicadangkan, bukan dibagikan, serta kernel kedua yang harus diperbarui. Ini adalah keputusan yang sama seperti pada Linux ketika memilih antara container dan mesin virtual penuh. Keputusan ini juga menentukan apakah Anda memerlukan VPS yang mendukung virtualisasi bertingkat di bawahnya.

Ekosistem, yaitu alasan utama yang sebenarnya membuat sebagian besar tim menggunakan Docker

Semua hal di atas membahas modelnya. Bagi sebagian besar tim, keputusan ditentukan oleh luasnya ekosistem di sekitar masing-masing model.

Docker menyediakan Docker Hub dan GHCR, docker compose, Kubernetes ketika satu server tidak lagi mencukupi, runner CI yang sudah mendukung container, serta quickstart dengan satu perintah di hampir setiap README proyek. Jails menyediakan FreeBSD ports tree yang besar dan dikelola dengan baik, serta kumpulan application bundle siap pakai yang jauh lebih sedikit. Jika sebuah proyek hanya menerbitkan container image tanpa format lain, pengguna FreeBSD harus membaca dokumentasinya dan merakit sendiri komponen-komponennya.

Jails unggul dalam kondisi sebaliknya. Gunakan jails jika Anda sudah menjalankan ZFS dan membutuhkan snapshot serta rollback untuk seluruh service, jika service Anda native di FreeBSD, jika Anda menginginkan userland lengkap untuk setiap tenant, atau jika Anda ingin kernel, packet filter, filesystem, dan dokumentasi dikelola bersama sebagai satu sistem. Poin terakhir inilah yang dimaksud ketika orang menyebut FreeBSD koheren. Penjelasan lebih lanjut tersedia dalam perbandingan Linux dan FreeBSD yang lebih luas sebagai platform server dan perubahan pada FreeBSD 15 untuk penggunaan sebagai server.

Sebagai penilaian akhir: jika tim Anda sudah menguasai Docker, biaya untuk berpindah itu nyata dan manfaatnya harus spesifik. Jangan berpindah demi kualitas isolasi; kedua model cukup serupa sehingga konfigurasi Anda lebih berpengaruh. Berpindahlah karena Anda menginginkan rollback seluruh service yang didukung ZFS, atau karena Anda sudah menggunakan FreeBSD.

FAQ

Dapatkah saya menjalankan image Docker di FreeBSD?

Tidak untuk image Linux, dan bukan sebagai metode yang didukung. FreeBSD memang mendukung container OCI: sudo pkg install -y podman-suite memasang Podman, yang menjalankan container melalui ocijail, yaitu runtime yang membuat jail nyata di bawahnya. Runtime ini memerlukan fdescfs yang di-mount pada /dev/fd untuk memantau container, serta pf untuk NAT container (network address translation). Image OCI native FreeBSD memberikan hasil terbaik. Image Linux juga memerlukan lapisan kompatibilitas Linux, dan per Agustus 2026 port Podman FreeBSD masih disebut eksperimental. Jika deployment Anda berupa stack image Linux, jalankan di Linux.

Apakah jail FreeBSD lebih aman daripada container Docker?

Keduanya menggunakan kernel host yang sama. Karena itu, bug pada kernel menjadi risiko bagi keduanya, dan tidak ada yang dapat Anda pilih sebagai batas keamanan untuk kode yang benar-benar tidak tepercaya. Perbedaannya terletak pada kondisi awal. Jail dimulai dengan serangkaian operasi yang secara luas ditolak, lalu Anda mengaktifkannya kembali satu parameter demi satu. Container Docker dimulai sebagai root di dalam sekumpulan namespace dengan beberapa capability yang dinonaktifkan, sedangkan penguatan keamanan tambahan harus diaktifkan secara eksplisit. Dalam praktiknya, konfigurasi lebih menentukan daripada modelnya: jail yang berjalan dengan allow.mount dan allow.raw_sockets diaktifkan tidak lebih aman daripada container yang dikonfigurasi dengan cermat.

Bagaimana cara mencadangkan jail?

Buat snapshot dataset, lalu kirimkan snapshot tersebut. sudo zfs snapshot zroot/jails/containers/web@backup, kemudian zfs send snapshot itu ke pool lain atau ke dalam file yang Anda salin keluar dari server. Karena jail menyimpan seluruh userland-nya dalam satu dataset, snapshot tersebut mencakup paket yang terpasang dan data pada satu titik konsisten, beserta setiap file konfigurasi yang Anda edit secara manual. Hal ini berlawanan dengan kebiasaan Docker, yaitu mencadangkan named volume dan file Compose, lalu membangun ulang bagian lainnya dari image.

Apakah saya memerlukan BastilleBSD, atau base system sudah cukup?

Base system sudah cukup, dan itu merupakan tempat yang lebih baik untuk memulai. jail.conf, jls, jexec, dan service jail start mencakup seluruh model tersebut. Setelah memahaminya, Anda dapat membaca konfigurasi host FreeBSD mana pun tanpa perlu mempelajari tooling host tersebut terlebih dahulu. Bastille adalah lapisan kemudahan di atasnya. Bastille melakukan bootstrap release, membuat thin jail, menerapkan template, dan menulis aturan redirect pf untuk Anda. Pelajari perintah dasar terlebih dahulu, lalu tambahkan Bastille ketika jumlah jail membuat pengetikan manual menjadi merepotkan.