Docker Konteyner Mimarisi: İzolasyon Nasıl Sağlanır
Docker, uygulamaları ve bağımlılıklarını tek bir taşınabilir birim halinde paketleyen bir konteynerleştirme platformudur. Ancak Docker'ın kendisi bir izolasyon teknolojisi değildir; izolasyonu sağlayan asıl bileşenler Linux çekirdeğinin sunduğu namespaces ve cgroups mekanizmalarıdır. Docker bu iki çekirdek özelliğini bir araya getirip kullanıcıya kolay bir arayüz sunar.
Namespaces: Görünürlük İzolasyonu
Namespace'ler, bir sürecin sistem kaynaklarını nasıl gördüğünü sınırlar. Her konteyner kendi namespace kümesiyle başlatılır ve bu sayede host sisteminden veya diğer konteynerlerden habersiz çalışır. Başlıca namespace türleri şunlardır:
- PID namespace: Konteyner içindeki süreç kendini PID 1 olarak görür, host'taki gerçek süreç ağacını göremez.
- NET namespace: Konteynerin kendi ağ arayüzü, IP adresi ve routing tablosu vardır.
- MNT namespace: Dosya sistemi bağlama noktaları izole edilir; konteyner kendi kök dizinini görür.
- UTS namespace: Hostname ve domain adı host'tan bağımsızdır.
- IPC namespace: Süreçler arası iletişim kaynakları (paylaşımlı bellek, semaforlar) izole edilir.
- USER namespace: Konteyner içindeki root kullanıcısı host üzerinde ayrıcalıksız bir UID'ye eşlenebilir.
cgroups: Kaynak Sınırlama
Namespace'ler görünürlüğü izole ederken, control groups (cgroups) kaynak tüketimini sınırlar ve önceliklendirir. CPU, bellek, disk I/O ve ağ bant genişliği gibi kaynaklar cgroups aracılığıyla kontrol edilir. Örneğin bir konteyneri belirli kaynaklarla sınırlamak için:
docker run -d \
--name web-app \
--memory=512m \
--cpus=1.5 \
--pids-limit=200 \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--read-only \
--security-opt=no-new-privileges \
nginx:alpine
Bu komutta bellek 512 MB, CPU kullanımı 1.5 çekirdekle sınırlanmış, tüm Linux capability'leri düşürülüp yalnızca gerekli olan eklenmiş, dosya sistemi salt-okunur yapılmış ve ayrıcalık yükseltmesi engellenmiştir. Prodüksiyon ortamlarında bu tür sıkılaştırma bayrakları saldırı yüzeyini ciddi biçimde daraltır.
Konteyner ile Sanal Makine Farkı
Sanal makineler donanım seviyesinde sanallaştırma yapar; her VM kendi çekirdeğini çalıştırır ve bir hipervizör (KVM, ESXi gibi) üzerinden yönetilir. Konteynerler ise host çekirdeğini paylaşır, bu da onları çok daha hafif ve hızlı başlatılabilir kılar ancak izolasyon sınırının VM'lere kıyasla daha ince olduğu anlamına gelir. Çekirdek paylaşımı, bir çekirdek zafiyetinin tüm konteynerleri etkileyebileceği anlamına gelir; bu yüzden ek katmanlar önemlidir.
Ek Güvenlik Katmanları
Namespace ve cgroups yeterli görülmediği için Docker ayrıca seccomp (izin verilen sistem çağrılarını filtreler), AppArmor/SELinux (zorunlu erişim kontrolü) ve rootless mode (Docker daemon'ının root olmayan bir kullanıcı altında çalıştırılması) gibi mekanizmalar sunar. Kurumsal ortamlarda konteynerleri asla --privileged bayrağıyla çalıştırmamak, imajları düzenli olarak taramak ve mümkün olduğunca rootless çalıştırma modelini tercih etmek temel bir güvenlik disiplinidir.
Sonuç
Docker'ın sağladığı izolasyon büyüsü aslında Linux çekirdeğinin onlarca yıldır geliştirdiği namespace ve cgroups altyapısına dayanır. Bu mekanizmaları anlamak, hem konteynerleri doğru sıkılaştırmak hem de bir güvenlik açığı durumunda etki alanını doğru değerlendirmek için şarttır. Konteyner mimarisini daha büyük ölçekte yönetmek isteyenler için bir sonraki doğal adım Kubernetes orkestrasyon katmanına geçmektir.