FreeBSD Jails ve Docker Container Farkları Nelerdir?
FreeBSD jails ile Docker container teknolojileri arasındaki temel farkları inceleyin. İzolasyon modelleri, dosya sistemi yapısı ve ağ yönetimi detaylarını öğ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 bir çekirdek üzerinde izole edilmiş kullanıcı alanları çalıştırır; dolayısıyla hiçbiri bir sanal makine değildir. Farklılık, 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 istediğiniz sayıda sürece sahip tam bir FreeBSD kullanıcı alanı çalıştırır. Bu sayfadaki diğer hemen hemen tüm farklılıklar, bu temel ayrımın bir sonucudur.
SSD Nodes, FreeBSD imajları sunmamaktadır. Bu platformda bir FreeBSD sunucusu kiralayamazsınız ve aşağıdakilerin hiçbiri buradan satın alabileceğiniz bir makine için kurulum kılavuzu değildir. Bu metin, bir iş yükünün hangisine ihtiyaç duyduğunu belirleyebilmeniz ve bir FreeBSD ekibinin kurulumunu tahmin yürütmeden okuyabilmeniz için hazırlanmış iki izolasyon modelinin karşılaştırmasıdır.
Jail yapısının teknik tanımı
Jail mekanizması, Mart 2000'de FreeBSD 4.0 ile kullanıma sunulmuştur; bu da onu cgroups yapısından daha eski ve Docker'dan yaklaşık on yıl daha kıdemli kılar. Bu 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 (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, çekirdek modülleri yükleyemez ve kendisine atanmamış ağ adreslerine bağlanamaz. Öğrenilmesi gereken ayrı bir ad alanı türü veya özellik bazlı bir katılım (opt-in) yoktur: kısıtlamalar tek bir birim olarak gelir ve jail yapılandırmasındaki parametrelerle ayarlanır.
Ana makinede, jls çalışan jail'leri listeler ve jexec web sh sizi web adındaki jail'in içinde bir kabuğa (shell) düşürür.
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/webBu 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 duran 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
jlsjls artık web öğesini bir 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 önyükleme betiğini (boot script) jail içinde çalıştırır; bu nedenle jail, kendi /etc/rc.conf dosyasında etkinleştirilmiş olan her servisi ayağa kaldırır. Docker container yapısında buna eşdeğer bir adım yoktur, çünkü Docker sadece 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 manuel doldurulan kullanıcı alanı
Bu, ilk günden itibaren hissedeceğiniz farktır.
Docker ile yazılımı adlandırırsınız ve onu teslim alırsınız. docker pull nginx, başkası tarafından oluşturulmuş ve test edilmiş, katmanlı ve içerik adresli bir imajı getirir; docker compose up -d ise bu imajı, birimlerini ve ağ bağlantılarını ekleyerek 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 halka açık bir jail imajı kayıt defteri sunmaz. Boş bir kullanıcı alanı oluşturur ve içine kurulum yaparsınız; bu, çıplak bir sunucuyu yapılandırmanızla aynı yöntemdir. Bu daha fazla yazma işlemi gerektirir. Aynı zamanda daha şeffaftır, çünkü jail içinde çalışan şey, pkg tarafından oraya konulan ve ana makinenin kullandığı paket setiyle aynı olan dosyadır.
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-RELEASEbastille setup ağ, depolama ve güvenlik duvarı yapılandırmasını sizin yerinize yapar. 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 onunla değiştirin.
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 webbastille 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 çalıştırı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ı verir. Jails ise kendi kurulumlarınızı yapmanızı sağlar. Eğer listenizdeki yazılım yalnızca container imajı olarak dağıtılıyorsa, bu durum diğer tüm kriterlerden önce kararı belirler.
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 yüzden 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-upgradeBunu çalıştırmadan önce gerçek dataset adını zfs list ile 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. Eğer yükseltme servisi bozarsa, rollback işlemi tüm userland'i, 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 asla böyle bir şeye ihtiyaç duymayacağınızı varsayar.
zfs clone işin diğer yarısıdır. Bir snapshot'ın clone'u, üst öğesiyle değişmemiş blokları paylaşan yeni ve yazılabilir bir jail'dir; bu nedenle 3 GB'lık bir jail'in staging kopyası, üzerinde değişiklik yapmaya başlayana kadar diskte neredeyse hiç 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 userland kopyasını tutan bir jail için:
sudo freebsd-update -b /usr/local/jails/containers/web fetch installThin jail'ler bu işin tekrarlanmasını önler. Paylaşılan salt okunur bir temel sistemi nullfs üzerinden mount ederler ve her jail'e kendine ait küçük, yazılabilir bir katman verirler; böylece temel sistemi bir kez yamalarsınız ve her jail sonucu görür. Bastille, varsayılan olarak thin jail'ler oluşturur.
Ağ oluşturma: yayınlanan portlar ve adresleme kararı
Docker ağ oluşturma işlemlerini 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 açıklanır.
Jail yapısı, 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ı yoktur, bu nedenle kendi güvenlik duvarını çalıştıramaz. Ayrıca tüm adresleri dinleyemez: 0.0.0.0 üzerinden istekte bulunan bir jail soketi, çekirdek tarafından jail'in kendi adresine yönlendirilecek şekilde yeniden yazılır. İ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; eklendiğinde 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, Docker'ın sunduğu yapıya en yakın eşleşmedir ve Bastille'in -V ve -B jail türlerinin arkasındaki çalışma modudur.
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 80Burada EXPOSE yoktur ve otomatik yayınlama yapılmaz. Adresi veya bir yönlendirme kuralı izin vermediği sürece hiçbir şey 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 stack yapı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 tahsisat üzerinde küçük bir maliyeti vardır. Ayarlanabilir parametreyi /boot/loader.conf dosyasına ekleyin ve sistemi yeniden başlatın:
kern.racct.enable=1Ardından bir kural belirleyin ve izleyin:
sudo rctl -a jail:web:vmemoryuse:deny=1g
rctl -hu jail:webrctl -hu jail:web, jail'in mevcut kullanımını insan tarafından okunabilir birimlerle yazdırır; böylece herhangi bir kesinti yaşanmadan önce sınırın ne kadar yakınında olduğunuzu görebilirsiniz. deny eylemi, sınır aşımı durumunda tahsisatın jail içinde başarısız olmasını sağlar; böylece ana makinede bir sonlandırma 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=YESDocker'ın açıkça daha pratik 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 hedefleyen, 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 çekirdeği yönetmektir. Bu, Linux üzerinde container yapıları ile 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'yi, docker compose, tek bir sunucunun yetmediği durumlarda Kubernetes'i, halihazırda entegre edilmiş konteyner destekli CI çalıştırıcılarını ve neredeyse her projenin README dosyasında yer alan tek komutluk hızlı başlangıç seçeneklerini beraberinde getirir. 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 sunar. Bir proje yalnızca konteyner 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 kendi yerini hak eder. ZFS kullanıyorsanız ve bir servisin tamamının anlık görüntüsünü (snapshot) alıp geri yüklemek (rollback) sizin için önemliyse, servisleriniz FreeBSD tabanlıysa, tek bir süreç yerine kiracı başına tam bir kullanıcı alanı (userland) istiyorsanız veya çekirdeğin, paket filtreleyicinin, dosya sisteminin 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 platformları olarak daha geniş karşılaştırması ve FreeBSD 15'in sunucu kullanımı için neleri değiştirdiği 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 de birbirine yeterince yakındır, bu nedenle yapılandırmanız izolasyondan daha önemlidir. ZFS destekli servis geri yükleme (rollback) istediğiniz için veya halihazırda FreeBSD kullanıyor olduğunuz için geçiş yapın.
FAQ
FreeBSD üzerinde Docker imajlarını ç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, konteynerleri arka planda gerçek jail yapıları oluşturan ocijail çalışma zamanı üzerinden ç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 edilmiş olması gerekir. FreeBSD tabanlı OCI imajları en iyi sonucu verir. Linux imajları ayrıca 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 Linux imajlarından oluşan bir yığın ise, bunu Linux üzerinde çalıştırın.
FreeBSD jail yapıları Docker konteynerlerinden daha mı güvenlidir?
Her ikisi de tek bir ana makine çekirdeğini paylaşır, bu nedenle çekirdek hataları her ikisi için de bir risktir ve her ikisi de gerçekten güvenilmeyen kodlar için tercih edilecek bir sınır değildir. Fark başlangıç noktasındadı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ış isim alanları (namespaces) 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 (dataset) 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 makine dışına 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 ve verileri tutarlı bir noktada yakalar hem de elle düzenlediğiniz tüm yapılandırma dosyalarını içerir. Bu, Docker'ın isimlendirilmiş birimleri (volumes) ve Compose dosyasını yedekleyip geri kalanını imajdan yeniden oluşturma alışkanlığının tam tersidir.
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 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 (thin) jail yapıları oluşturur, şablonlar uygular ve sizin için pf yönlendirme kurallarını yazar. Önce temel komutları öğrenin, ardından jail sayısı yazmayı zahmetli hale getirdiğinde Bastille ekleyin.