İçeriğe geç
edumintsBlog
Backend3 dk okuma

Docker Aslında Çok Tuhaf Bir Araç

Kaynak: Hacker News

Paylaş
BackendEdumints Blog
İçindekiler 6 başlık

Eğlence amacıyla kendi konteyner çalışma zamanınızı (container runtime) yazmaya başladığınızda, her gün kullandığınız teknolojilerin perde arkasında ne kadar ilginç mekanizmalar barındırdığını hızla fark edersiniz. Bu süreçte Docker hakkında öğrendiğimiz bazı tuhaf gerçekleri ve yazılım geliştirme açısından pratik çıkarımları birlikte inceleyelim.

Konteynerler Gerçek Değildir#

Sanal makinelerin (VM) aksine, konteynerler aslında sadece üzerlerine özel kısıtlamalar uygulanmış standart işletim sistemi süreçleridir (processes). Ana makinenizin çekirdeği (kernel) bu süreci doğrudan çalıştırmaya devam eder. Hatta nereye bakacağınızı bilirseniz, çalışan konteyner sürecini ana makinenin /proc dizini altında kolayca bulabilirsiniz.

  • Pratik Çıkarım: Konteynerleri hafif sanal makineler gibi düşünmek yerine izole edilmiş süreçler olarak görmek, üretim ortamındaki performans ve hata ayıklama (debugging) yaklaşımlarınızı kökten değiştirecektir.

Konteynerler Gerçekten Gerçek Değildir#

Linux çekirdeğinde doğrudan "konteyner" adında tek bir özellik yoktur. Bunun yerine konteynerler, trençkot giymiş 5 farklı Linux çekirdek özelliğinin bir araya gelmesinden oluşur:

  • Namespaces (İsim Alanları): Ana bilgisayarın ve konteynerin neleri görebileceğini gizler ve izole eder.
  • cgroups: Konteynerin CPU ve bellek gibi kaynak kullanımlarını sınırlar.
  • Ağ İzolasyonu: Konteynerin ağını izole etmeyi sağlayan karmaşık ağ mekanizmalarını içerir.

İmajlar Sadece Klasörlerden İbarettir#

Docker imajları, Docker'ın sistemde bir yere yerleştirdiği ve ardından o klasörü konteyner sürecinin yeni kök dizini (root directory) yapmak için chroot (veya pivot_root) çağırdığı standart klasörlerdir. Örneğin docker run -it --rm ubuntu /bin/bash komutunu çalıştırdığınızda Docker sırasıyla şunları yapar:

  • Dockerhub üzerinden ubuntu imajını indirir.
  • Bu imajı dosya sisteminde belirli bir dizine yerleştirir.
  • /tuhaf/bir/docker/yolu/bin/bash dizinindeki çalıştırılabilir dosyayı başlatır.

Go, Bir Konteyner Çalışma Zamanı İçin Pek Uygun Bir Dil Değildir#

Docker'ın konteyner çalışma zamanı olan runc, Go dilinde yazılmıştır; ancak Go'nun bazı tasarım tercihleri onu bu iş için zorlu bir seçenek haline getirir. Go çalışma zamanı doğası gereği çok iş parçacıklıdır (multi-threaded). Oysa bir konteyner çalışma zamanının yapması gereken birçok Linux sistem çağrısı (syscall) tek iş parçacıklı (single-threaded) bir ortamda gerçekleştirilmelidir. Bu yüzden runc, Go çalışma zamanı başlamadan önce devreye giren karmaşık bir C modülü kullanır.

Ayrıca Go dilinde doğrudan fork bulunmaz! fork yalnızca ana iş parçacığını kopyaladığı için Go gibi çok iş parçacıklı çalışma zamanlarında tehlikeli sonuçlar doğurabilir. Oysa bir konteyner çalışma zamanı süreci çatallamak (fork), kısıtlamaları ayarlamak ve ardından docker run ile verdiğiniz komutu çalıştırmak (exec) ister. runc bu engeli aşmak için, bir alt süreç (child process) olduğunu belirten özel bir komut satırı argümanıyla /proc/self/exe üzerinden kendi kendini çalıştırarak fork işlemini taklit eder.

Docker Root Yetkisi Gerektirir!#

Docker'ı macOS üzerinde kullanıyorsanız bu detayı gözden kaçırmanız çok kolaydır. Konteyner çalışma zamanlarının kullandığı Linux çekirdek API'lerinin çoğu root olarak çalıştırılmayı gerektirir (veya eskiden gerektiriyordu); bu nedenle Docker servisi (daemon) genellikle root yetkileriyle çalışır. Bu durum, Güvenli Model Registry ve Container Güvenliği açısından konteyner güvenliğini oldukça zorlu bir iş haline getirir. Günümüzde rootless (root yetkisiz) konteyner çalışma zamanları ile durum iyileşmiş olsa da ağ iletişimi hâlâ büyük bir istisnadır. Rootless bir çalışma zamanı kullanıyorsanız, aynı ağ özelliklerini sunabilmek için tüm ağ yığınını kullanıcı alanında (userspace) yeniden uygulamak gerekir.

Öğrenmek Eğlencelidir!#

Kullandığınız bir aracın kendi versiyonunu sıfırdan yazmaya çalışmak, o aracın nasıl çalıştığını derinlemesine öğrenmenin en etkili yoludur. Soyutlama katmanlarının altına inmek, karşılaştığınız sistem hatalarını çok daha hızlı çözmenizi sağlayan güçlü bir mühendislik pratiğidir.

Kaynak ve atıf

Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • codeandcake.dev/posts/2026-10-22-docker-is-weird