SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-27

FreeBSD Jails ve Docker Arasındaki Temel Farklar

FreeBSD jails ile Docker container teknolojilerini karşılaştırın. İzolasyon modelleri, dosya sistemi yapıları, ağ yönetimi ve kaynak limitleri arasındaki teknik farkları öğrenin.

FreeBSD jails ve Docker container karşılaştırması

FreeBSD jails ve Docker container, aynı sorunu iki farklı biçimde çözer. Her ikisi de paylaşılan tek bir çekirdek üzerinde izole edilmiş kullanıcı alanları çalıştırır; dolayısıyla ikisi de sanal makine değildir. Aralarındaki fark, içeriğin yapısından kaynaklanır. Bir Docker container, bir kayıt defterinden çekilen katmanlı bir imajdan tek bir süreç çalıştırır. Bir jail ise kendi /etc yapısına, kendi rc başlangıç betiklerine, kendi pkg veritabanına ve dilediğiniz sayıda sürece sahip tam bir FreeBSD kullanıcı alanı çalıştırır. Bu sayfadaki diğer tüm farklılıklar temel olarak bu yapısal farktan kaynaklanır.

SSD Nodes, FreeBSD imajları sunmamaktadır. Bu platform üzerinden FreeBSD sunucusu kiralayamazsınız ve aşağıdakilerin hiçbiri, buradan satın alabileceğiniz bir makine için kurulum kılavuzu niteliği taşımaz. Bu metin, bir iş yükünün hangi izolasyon modeline ihtiyaç duyduğunu belirleyebilmeniz ve bir FreeBSD ekibinin kurulumunu tahmin yürütmeden okuyabilmeniz için hazırlanmış bir karşılaştırmadır.

Jail yapısının teknik tanımı

Jail mekanizması FreeBSD 4.0 sürümü ile Mart 2000 tarihinde kullanıma sunulmuştur; bu da onu cgroups yapısından daha eski, Docker'dan ise yaklaşık on yıl daha kıdemli kılar. Mekanizma tek bir çekirdek çağrısına dayanır. jail(8) bir dizin ağacını alır ve içindeki süreçleri bir jail kimliği (jail ID) atayarak başlatır; çekirdek, bu kimliğe sahip herhangi bir süreç için belirli bir işlem kümesini reddeder. Jail içindeki bir süreç, kendi jail'inin dışındaki süreçleri göremez, dosya sistemlerini bağlayamaz (mount) veya ayıramaz (unmount), çekirdek modülleri yükleyemez ve jail'e atanmamış ağ adreslerine bağlanamaz. Öğrenilmesi gereken ayrı bir isim alanı (namespace) türü veya özellik bazlı bir katılım mekanizması yoktur: kısıtlamalar tek bir bütün halinde gelir ve jail yapılandırmasındaki parametrelerle ayarlanır.

Ana makine üzerinde jls çalışan jail'leri listeler, jexec web sh ise sizi web isimli jail'in içine bir kabuk (shell) ile sokar.

Bir jail oluşturmak için FreeBSD kullanıcı alanını (userland) bir dizine yerleştirmeniz gerekir. Temel sistem bunu sizin yerinize yapar:

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

Bu komut, sürümünüz için temel dağıtım setini getirir ve standart kurulum sonrası adımlarını çalıştırır; böylece yeni bir sunucuda yaptığınız gibi root parolasını belirler ve saat dilimini seçersiniz. Sonuç, bir klasör içinde yer alan tam bir FreeBSD kurulumudur. Ardından bunu /etc/jail.conf içinde tanımlarsınız:

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;
}

Jail'i başlatın ve durumunu kontrol edin:

sudo service jail start web
jls

jls artık web öğesini JID, ana makine adı ve IP adresi ile listelemelidir. Eğer jail görünmüyorsa, sudo jail -c web komutunu doğrudan çalıştırın. Bu komut, aynı yapılandırmayı ön planda uygular ve hatayı servis çıktısında bırakmak yerine kabul edemediği parametreyi ekrana yazdırır.

İki kez okunması gereken satır exec.start = "/bin/sh /etc/rc" satırıdır. Bir jail'i başlatmak, FreeBSD'nin normal açılış betiğini (boot script) jail içinde çalıştırır; böylece jail, kendi /etc/rc.conf dosyasında etkinleştirilen tüm servisleri başlatır. Docker container yapısında buna eşdeğer bir adım yoktur; çünkü Docker, imajın giriş noktası (entrypoint) sürecini çalıştırır ve o süreç durduğunda container da durur.

Yazılımı sisteme dahil etme: imajlar ve kayıt defterleri ile doldurulabilir kullanıcı alanı karşılaştırması

Bu, ilk gün hissedeceğiniz farktır.

Docker ile yazılımı adlandırırsınız ve teslim alırsınız. docker pull nginx, başkası tarafından oluşturulmuş ve test edilmiş, katmanlı ve içerik adresli bir imajı çeker; docker compose up -d ise bunu birimleri ve ağ bağlantılarıyla birlikte başlatır. Kayıt defteri (registry) ürünün kendisidir. Docker iş akışındaki değerin büyük kısmı, binlerce projenin çalışan bir imaj yayınlamasından gelir; bu da bir VPS üzerinde Docker çalıştırmayı bir proje olmaktan çıkarıp kısa bir iş haline getirir.

FreeBSD, varsayılan olarak herhangi bir genel jail imajı kayıt defteri ile gelmez. Boş bir kullanıcı alanı oluşturur ve içine kurulum yaparsınız; tıpkı çıplak bir sunucuyu yapılandırır gibi. Bu daha fazla yazım gerektirir. Aynı zamanda daha şeffaftır, çünkü jail içinde çalışan şey, pkg tarafından, ana makinenin kullandığı paket setiyle oraya yerleştirilen şeydir.

Araçlar bu süreci kısaltır. BastilleBSD yaygın kullanılan bir jail yöneticisidir ve bir paket olarak sunulur:

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

bastille setup ağ, depolama ve güvenlik duvarı yapılandırmasını sizin yerinize halleder. bastille bootstrap bir sürümü bir kez indirir ve sonrasında oluşturduğunuz her jail bunu yeniden kullanır. FreeBSD 15.1, Haziran 2026 itibarıyla mevcut üretim sürümüdür; kullandığınız sürüm hangisiyse onu kullanın.

Bir jail oluşturmak tek bir komut, içini doldurmak ise bir komut daha gerektirir:

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 size jail içinde bir oturum kabuğu sağlar, bastille list ise ana makinede nelerin var olduğunu gösterir. Bir kurulumu tekrarlamak için Bastille şablonları, adımları bir dosyada tutar ve bunları bir jail'e uygular; bu, bu dünyada Dockerfile'a en yakın şeydir. Bir şablon her jail üzerinde yeniden oynatılır. Hiçbir şey önceden oluşturulmuş olarak gelmez.

Dürüst özet kısadır. Docker size başkalarının oluşturduğu yapıları sunar. Jail'ler ise kendi kurulumlarınızı yapmanızı sağlar. Eğer kısa listenizdeki yazılım yalnızca bir konteyner imajı olarak dağıtılıyorsa, bu durum diğer tüm kriterlerden önce soruyu yanıtlamış olur.

Durum ve yükseltmeler: ZFS değişikliklerinin olduğu kısım

Docker, durumu bilinçli olarak ayırır. Container dosya sistemi geçicidir; verileriniz adlandırılmış bir volume veya bind mount içinde yaşar ve bir yükseltme işlemi docker compose pull komutunu takiben docker compose up -d komutuyla gerçekleştirilir. Container değiştirilir ve volume içine koymadığınız her şey silinir. Kurala uyduğunuzda bu bir özelliktir, unuttuğunuzda ise veri kaybı olayıdır; bu nedenle bind mount ve adlandırılmış volume seçimi bir Compose yığınında bu kadar büyük önem taşır.

Jail yapısı durumu ayırmaz ve bunun çalışmasını sağlayan şey ZFS'tir. Tüm jail tek bir dataset'tir:

sudo zfs snapshot zroot/jails/containers/web@pre-upgrade
sudo pkg -j web upgrade
sudo zfs rollback zroot/jails/containers/web@pre-upgrade

Bunu çalıştırmadan önce zfs list ile gerçek dataset adını kontrol edin; yukarıdaki yol, el kitabının kullandığı düzeni yansıtır. Snapshot işlemi yaklaşık bir saniye sürer ve jail içeriği değişene kadar neredeyse hiç yer kaplamaz. Yükseltme servisi bozarsa, geri alma (rollback) işlemi tüm kullanıcı alanını (userland), paket veritabanı ve gece saat 02:00'de elle düzenlediğiniz yapılandırma dosyaları dahil olmak üzere önceki durumuna döndürür. Docker'ın yerleşik bir karşılığı yoktur, çünkü modeli böyle bir şeye asla ihtiyaç duymayacağınızı varsayar.

zfs clone işin diğer yarısıdır. Bir snapshot'ın kopyası (clone), üst öğesiyle değişmemiş blokları paylaşan yeni ve yazılabilir bir jail'dir; bu nedenle 3 GB'lık bir jail'in hazırlık kopyası, üzerinde değişiklik yapmaya başlayana kadar diskte neredeyse hiçbir yer kaplamaz. Bir FreeBSD yöneticisi, yükseltme provası yapmak için "üretim ortamıyla aynı" jail'i bu şekilde oluşturur.

Temel sistem yükseltmesi, paketlerden ayrıdır. Kendi kullanıcı alanı kopyasını tutan bir jail için:

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

İnce (thin) jail'ler bu işin tekrarlanmasını önler. Tek bir paylaşılan salt okunur tabanı nullfs üzerinden bağlarlar ve her jail'e kendine ait küçük, yazılabilir bir katman verirler; böylece tabanı bir kez yamalarsınız ve her jail sonucu görür. Bastille, varsayılan olarak ince jail'ler oluşturur.

Ağ oluşturma: yayınlanan portlar ve adresleme kararı

Docker ağ yapılandırmasını sizin yerinize yapar ve istisnaları yayınlamanızı ister. Container'lar bir köprü (bridge) üzerinde konumlanır, kullanıcı tanımlı bir ağda servis adları üzerinden birbirlerine ulaşırlar ve -p 8080:80 bunlardan birini ana makineye (host) açar. Docker bunu gerçekleştirmek için kendi paket filtreleme kurallarını yazar; yayınlanan bir container portunun ufw kurallarını nasıl doğrudan baypas ettiği de bu şekilde gerçekleşir.

Jail yapısı ise modeli en başta seçmenizi gerektirir ve iki seçenek mevcuttur.

Paylaşımlı IP (Shared IP). ip4.addr = "10.0.0.10", ilgili adresi mevcut bir ana makine arayüzüne ekler ve jail'i bu adresle kısıtlar. Jail'in kendine ait bir ağ yığını (network stack) yoktur, bu nedenle kendi güvenlik duvarını çalıştıramaz. Ayrıca tüm adreslere bağlanamaz: 0.0.0.0 üzerinden dinleme yapmaya çalışan bir jail soketi, çekirdek (kernel) tarafından jail'in kendi adresine yönlendirilir. İki jail aynı adresin 80 numaralı portunu aynı anda dinleyemez; bu yüzden her birine ayrı bir adres vermeniz veya önüne bir reverse proxy koymanız gerekir.

VNET. Jail'e vnet; eklediğinizde, jail tam bir ağ yığınına sahip olur: kendi arayüzleri, kendi yönlendirme tablosu ve kendi güvenlik duvarı kuralları. Jail'i ana makineye, her iki ucu farklı taraflarda olan sanal bir kablo olan epair ile bağlarsınız ve ana makine tarafını bir köprüye (bridge) dahil edersiniz. Bu yapı, Docker'ın sunduğu modele en yakın olanıdır ve Bastille'in -V ve -B jail türlerinin temelini oluşturur.

Bir ana makine portunu jail içine yönlendirmek, bir pf yönlendirme kuralıdır. Bastille bunu şu şekilde sarmalar:

sudo bastille rdr web tcp 80 80

Burada EXPOSE veya otomatik yayınlama gibi bir mekanizma yoktur. Adresi veya bir yönlendirme kuralı izin vermediği sürece hiçbir trafik jail'e ulaşamaz. Bu, daha yavaş bir başlangıç ancak çok daha sessiz bir güvenlik duvarı anlamına gelir.

Kaynak sınırları: cgroups ve rctl karşılaştırması

Docker, bir container'ı cgroups ile sınırlar ve bu sınırlar container'ın tanımlandığı yerde bulunur: komut satırında --memory=1g --cpus=1.5 veya Compose dosyasındaki karşılık gelen anahtarlar. Eğer yığınınızı zaten bir VPS üzerindeki Docker Compose dosyasında tutuyorsanız, sınır uygulandığı servisin yanında yer alır ve git ile birlikte taşınır.

FreeBSD, rctl kullanır ve bu, etkinleştirmeniz gereken bir alt sistemdir. Kaynak muhasebesi varsayılan olarak kapalıdır çünkü her tahsisatta küçük bir maliyeti vardır. Ayarlanabilir parametreyi /boot/loader.conf dosyasına ekleyin ve sistemi yeniden başlatın:

kern.racct.enable=1

Ardından bir kural belirleyin ve izleyin:

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

rctl -hu jail:web, jail'in mevcut kullanımını insan tarafından okunabilir birimlerle yazdırır; böylece herhangi bir sorun yaşanmadan önce sınırın ne kadar yakınında olduğunuzu görebilirsiniz. deny eylemi, sınır aşan tahsisatın jail içinde başarısız olmasını sağlar; böylece ana makinede bir kill mesajı yerine uygulamanın kendi tahsisat hatasını görürsünüz.

rctl -a ile eklenen kurallar bir sonraki yeniden başlatmada kaybolur. FreeBSD'nin rctl servisi bunları /etc/rctl.conf dosyasından yeniden yükler, bu nedenle kuralı bu dosyaya yazın ve servisi etkinleştirin:

sudo sysrc rctl_enable=YES

Docker'ın açıkça daha kullanışlı olduğu nokta burasıdır. Bir Compose dosyasındaki sınır, kısıtladığı servis ile birlikte gözden geçirilir. Bir rctl kuralı ise başka bir yerde tanımlanmış bir jail'i adlandıran ayrı bir dosyadaki satırdan ibarettir.

Cevap sanal makine olduğunda: bhyve

Jail, ana makine çekirdeğini paylaştığı için bazı özelliklere erişim kalıcı olarak mümkün değildir. Farklı bir çekirdek sürümü çalıştıramaz, çekirdek modülü yükleyemez ve Linux container yapılarının aksine Linux ikili dosyalarını doğrudan çalıştıramaz. FreeBSD, linuxulator adında bir Linux uyumluluk katmanına sahiptir ancak bu katman yalnızca Linux sistem çağrılarının bir alt kümesini uygular ve rastgele Linux imajları için genel bir çözüm değildir.

bhyve, FreeBSD'nin hipervizörüdür ve gerçek bir makine sınırına ihtiyaç duyduğunuzda; yani farklı bir işletim sistemi, farklı bir çekirdek veya çekirdeğini paylaşmak istemediğiniz bir kiracı söz konusu olduğunda doğru araçtır. Bunun bedeli, paylaşılan bellek yerine ayrılmış bellek kullanmak ve yamalanması gereken ikinci bir çekirdektir. Bu, Linux üzerinde container ve tam sanal makineler arasında verdiğiniz kararla aynıdır ve iç içe sanallaştırmayı destekleyen bir VPS ihtiyacınız olup olmadığını belirleyen temel unsurdur.

Ekiplerin Docker kullanmasının asıl nedeni olan ekosistem

Yukarıdaki her şey modele ilişkindir. Çoğu ekip için tercihi belirleyen unsur, her bir seçeneğin etrafındaki dünyanın büyüklüğüdür.

Docker; Docker Hub ve GHCR, docker compose, tek bir sunucunun yetmediği durumlarda Kubernetes, halihazırda entegre edilmiş container destekli CI çalıştırıcıları ve neredeyse her projenin README dosyasında yer alan tek komutluk hızlı başlangıç imkanı sunar. Jails ise geniş ve özenle bakımı yapılan FreeBSD ports ağacını ve buna ek olarak çalışmaya hazır çok daha küçük bir uygulama paketi setini beraberinde getirir. Bir proje yalnızca container imajı yayınladığında, FreeBSD tarafındaki yöntem, dokümantasyonu okuyup parçaları kendinizin birleştirmesidir.

Jails, bu takasın diğer tarafında yerini hak eder. ZFS kullanıyorsanız ve tüm bir servisin snapshot ve rollback işlemlerine değer veriyorsanız, servisleriniz FreeBSD tabanlıysa, tek bir süreç yerine kiracı başına tam bir kullanıcı alanı (userland) istiyorsanız veya çekirdek, paket filtreleyici, dosya sistemi ve dokümantasyonun tek bir sistem olarak korunmasını istiyorsanız Jails tercih edilmelidir. İnsanların FreeBSD'yi tutarlı olarak tanımlarken kastettikleri son nokta budur; bu konu Linux ve FreeBSD'nin sunucu platformu olarak daha geniş karşılaştırması ve FreeBSD 15'in sunucu kullanımı için getirdiği değişiklikler bölümlerinde daha detaylı ele alınmıştır.

Son bir değerlendirme: Ekibiniz halihazırda Docker biliyorsa, geçişin maliyeti gerçektir ve elde edilecek kazancın somut olması gerekir. İzolasyon kalitesi için geçiş yapmayın; iki model birbirine yeterince yakındır ve yapılandırmanız izolasyon kalitesinden daha önemlidir. ZFS destekli servis geri alma (rollback) istediğiniz için veya halihazırda FreeBSD kullanıyorsanız geçiş yapın.

FAQ

FreeBSD üzerinde Docker imajları çalıştırabilir miyim?

Linux imajlarını çalıştıramazsınız ve bu desteklenen bir yöntem değildir. FreeBSD, OCI konteyner desteğine sahiptir: sudo pkg install -y podman-suite, arka planda gerçek jail yapıları oluşturan bir çalışma zamanı olan ocijail aracılığıyla konteynerleri çalıştıran Podman'i kurar. Konteyner izleyicisi için /dev/fd üzerinde fdescfs dizininin, konteyner NAT (ağ adresi çevirisi) için ise pf dizininin mount edilmesi gerekir. FreeBSD tabanlı OCI imajları en iyi sonucu verir. Linux imajları ek olarak Linux uyumluluk katmanını gerektirir ve Ağustos 2026 itibarıyla FreeBSD Podman portu hala deneysel olarak tanımlanmaktadır. Eğer dağıtımınız bir Linux imaj yığını ise, bunu Linux üzerinde çalıştırın. RHEL ailesinde bu, Rocky Linux veya AlmaLinux üzerinde Docker kurulumu anlamına gelir; burada Podman, siz henüz hiçbir şey kurmadan önce docker komutuna sahip olan paket olarak zaten karşınıza çıkar.

FreeBSD jail yapıları Docker konteynerlerinden daha mı güvenlidir?

Her ikisi de aynı ana makine çekirdeğini paylaşır, bu nedenle çekirdek hataları her ikisi için de bir risktir ve hiçbiri güvenilmeyen kodlar için tercih edeceğiniz bir sınır değildir. Aradaki fark başlangıç noktasıdır. Bir jail, geniş bir işlem kümesinin reddedilmesiyle başlar ve siz bunları parametre bazında yeniden etkinleştirirsiniz. Bir Docker konteyneri ise, bazı yetenekleri kısıtlanmış bir isim alanı kümesi içinde root kullanıcısı olarak başlar ve daha fazla sıkılaştırma isteğe bağlıdır. Uygulamada, yapılandırma modelden daha belirleyicidir: allow.mount ve allow.raw_sockets etkinleştirilmiş bir jail, dikkatlice yapılandırılmış bir konteynerden daha güvenli değildir.

Bir jail yedeğini nasıl alırım?

Veri kümesinin anlık görüntüsünü (snapshot) alın ve gönderin. sudo zfs snapshot zroot/jails/containers/web@backup komutunu kullanın, ardından bu anlık görüntüyü zfs send ile başka bir havuza veya sunucudan kopyalayacağınız bir dosyaya aktarın. Bir jail, tüm kullanıcı alanını tek bir veri kümesinde tuttuğu için, anlık görüntü hem kurulu paketleri hem de verileri tutarlı bir noktada, elle düzenlediğiniz tüm yapılandırma dosyalarıyla birlikte yakalar. Bu, Docker alışkanlığının tam tersidir; Docker'da isimlendirilmiş birimleri ve Compose dosyasını yedekleyip geri kalanını imajdan yeniden oluşturursunuz.

BastilleBSD kullanmam gerekiyor mu, yoksa temel sistem yeterli mi?

Temel sistem yeterlidir ve başlamak için daha iyi bir yerdir. jail.conf, jls, jexec ve service jail start komutları tüm modeli kapsar; bunları öğrendiğinizde, o sunucunun özel araçlarını öğrenmek zorunda kalmadan herhangi bir FreeBSD sunucusunu okuyabilirsiniz. Bastille bunun üzerinde bir kolaylık katmanıdır: sürümleri önyükler, ince jail yapıları oluşturur, şablonlar uygular ve sizin için pf yönlendirme kurallarını yazar. Önce temel komutları öğrenin, jail sayısı yazmayı zahmetli hale getirdiğinde Bastille ekleyin.