İçeriğe atla
Makale

Docker Nedir? Container ile Sanal Makine Farkı

Docker, uygulamaları container olarak paketleyip her yerde aynı biçimde çalıştıran platformdur. Image, Dockerfile, Kubernetes ve güvenliği anlattık.

Oğuzhan Gerçek··6 dk okuma
Docker Nedir? Container ile Sanal Makine Farkı

Kısa cevap: Docker, uygulamaları container adı verilen yalıtılmış birimler hâlinde paketleyip çalıştırmaya yarayan açık bir platformdur. Uygulama, çalışmak için gereken her şeyle birlikte bir image'a konur; bu image'dan başlatılan container, geliştiricinin bilgisayarında da veri merkezinde de bulutta da aynı biçimde çalışır. Container sanal makineden hafiftir, çünkü kendi işletim sistemini taşımaz ve ana makinenin çekirdeğini paylaşır. Çok sayıda container'ı birden fazla sunucuda yönetmek içinse Kubernetes gibi bir orkestrasyon platformu kullanılır.

Docker nedir?

Docker belgeleri Docker'ı uygulama geliştirmek, dağıtmak ve çalıştırmak için açık bir platform olarak tanımlıyor; amaç, uygulamayı altyapıdan ayırıp yazılımı hızlı teslim etmek. Docker'ın kendi anlatımıyla Solomon Hykes, Docker'ı ilk kez PyCon 2013'te sahnede tanıttı.

Docker'ın temel birimi container: Docker'ın tarifiyle ana makinede önceden kurulu bir bağımlılığa dayanmadan çalışmak için gereken her şeyi taşıyan birim. Docker, Go diliyle yazılmış ve Linux çekirdeğinin özelliklerinden yararlanıyor; container'ı yalıtılmış bir çalışma alanına dönüştüren de çekirdeğin namespace özelliği. Container'ın her bileşeni ayrı bir namespace'te çalışır; bu yüzden bir container'daki süreçler başka bir container'daki süreçleri göremez.

Docker nasıl çalışır?

Docker istemci-sunucu mimarisine dayanır. docker run gibi bir komut yazdığınızda istemci komutu Docker daemon'una (dockerd) gönderir, daemon da onu yerine getirir. Daemon, Docker API isteklerini dinler ve image, container, ağ ve volume gibi nesneleri yönetir; istemci aynı makinedeki ya da uzaktaki bir daemon'a bağlanabilir.

Temel kavramlar: image, container, Dockerfile, registry

  • Image: Container oluşturmak için talimatlar içeren, salt okunur bir şablon.
  • Container: Bir image'ın çalıştırılabilir örneği.
  • Dockerfile: Bir image'ı oluşturmak için komut satırında verilebilecek bütün komutları içeren metin dosyası. Her Dockerfile, temel alınacak image'ı belirten FROM talimatıyla başlar ve dosyadaki her talimat image'da bir katman oluşturur.
  • Registry: Image'ların saklandığı depo. Docker Hub herkesin kullanabildiği public bir registry; Docker image'ları varsayılan olarak orada arar.

Docker'ın başlangıç rehberindeki örnek komut, Docker Hub'daki bir image'dan arka planda bir container başlatır:

docker run -d -p 8080:80 docker/welcome-to-docker

-d container'ı arka planda çalıştırır; -p 8080:80 ise ana makinenin 8080 numaralı portunu container'ın 80 numaralı portuna bağlar. Komuttan sonra uygulama tarayıcıda http://localhost:8080 adresinden açılır. Port kavramını port yazımızda anlattık.

Container ile sanal makine farkı

Docker'ın karşılaştırmasıyla sanal makine, kendi çekirdeği, donanım sürücüleri, programları ve uygulamalarıyla eksiksiz bir işletim sistemidir. Container ise çalışmak için gereken bütün dosyaları yanında taşıyan, yalıtılmış bir süreçten ibarettir. Container'lar aynı çekirdeği paylaştığı için aynı altyapıda daha çok uygulama çalışabilir; bunun bedeli, yalıtımın sanal makinedeki kadar güçlü olmaması. Ayrıntılı karşılaştırmayı sanal makine yazımızda yaptık.

OCI: container'ların ortak standardı

Container biçimi Docker'a özgü kalmadı. Open Container Initiative (OCI), 22 Haziran 2015'te Docker, CoreOS ve container sektöründeki başka şirketler tarafından, container biçimleri ve çalışma zamanları (runtime) için açık standartlar oluşturmak amacıyla Linux Foundation çatısı altında kuruldu. Docker da kendi container biçimini ve runC adlı çalışma zamanını bu girişime devretti.

OCI'ın bugün üç belirtimi var: container'ın diskteki dosya sistemi paketinden nasıl çalıştırılacağını anlatan Runtime Specification, image biçimini tanımlayan Image Specification ve image dağıtım API'sini standartlaştıran Distribution Specification. Bu standartlar sayesinde image'ı oluşturan araç ile onu çalıştıran araç farklı olabiliyor.

Docker ve Kubernetes

Docker, tek bir makinede container oluşturmayı ve çalıştırmayı kolaylaştırır; birden fazla sunucuya yayılmış çok sayıda container'ı yönetmek ise orkestrasyon işi. Kubernetes, belgelerindeki tanımıyla container'a alınmış iş yüklerini ve servisleri yönetmek için taşınabilir, genişletilebilir, açık kaynak bir platform; Google projeyi 2014'te açık kaynak yaptı. Kubernetes çöken container'ları yeniden başlatır, container'ları bir DNS adı ya da IP adresiyle erişime açar ve yeni sürüme geçişi kontrollü bir hızla yürütür. Uygulamanızı derlemez: image'ı Docker gibi bir araç üretir, Kubernetes çalıştırır.

İlişkinin bir kırılma noktası var. Kubernetes'in v1.24'ten önceki sürümleri Docker Engine ile dockershim adlı bir bileşen üzerinden doğrudan entegre çalışıyordu; bu entegrasyon artık Kubernetes'in parçası değil. Kubernetes bugün Container Runtime Interface (CRI) ile uyumlu bir çalışma zamanı istiyor: containerd, CRI-O ya da cri-dockerd adaptörü üzerinden Docker Engine. Kubernetes ekibinin ifadesiyle Docker ile üretilen image'lar bütün çalışma zamanlarında eskisi gibi çalışmaya devam ediyor.

Bir pod'un gerçekten trafik almaya hazır olup olmadığının nasıl doğrulanacağını Reliability Friday 02 yazımızda, iç platform ekiplerinin 2026'daki durumunu platform mühendisliği yazımızda ele aldık.

Docker güvenliği: iyi uygulamalar

Container yalıtımı tek başına güvenlik anlamına gelmiyor. Docker belgelerindeki temel öneriler şunlar:

  1. Güvenilir image ile başlayın: Docker, image'ın güvenilir bir kaynaktan oluşturulmasını ve küçük tutulmasını öneriyor; Docker Official Images düzenli güncellenen, seçilmiş bir koleksiyon.
  2. Sürümü sabitleyin: Image etiketleri (tag) değişebilir; yayıncı aynı etiketi yeni bir image'a yönlendirebilir. Tedarik zincirini güvenceye almak için sürüm belirli bir digest'e sabitlenebilir.
  3. Düzenli olarak yeniden oluşturun: Docker image'ları değiştirilemez (immutable); güncel ve güvenli kalmaları için güncel bağımlılıklarla düzenli olarak yeniden oluşturulmaları gerekiyor.
  4. Gereksiz paket kurmayın: Docker'a göre bu, image'ın karmaşıklığını, bağımlılıklarını, boyutunu ve derleme süresini azaltır.
  5. Gereksiz yetki vermeyin: Servis yetkisiz çalışabiliyorsa USER ile root olmayan bir kullanıcıya geçin. Docker Engine güvenlik belgesine göre daemon, Rootless mode seçilmedikçe root yetkisi ister; bu yüzden daemon'u yalnızca güvenilir kullanıcılar yönetmeli. Container'larda da yalnızca gerçekten gereken Linux yetkileri (capabilities) kalmalı.

--privileged bayrağı ayrıca dikkat istiyor. Docker'ın komut belgesine göre bu bayrak bütün Linux çekirdek yetkilerini açar, varsayılan seccomp ve AppArmor profillerini devre dışı bırakır; bu modda çalışan bir container ana makinede root kabuğu elde edip sistemin kontrolünü alabilir. Container platformlarının işletimini cloud-native platformlar, CI/CD ve container orkestrasyonu tarafını DevOps çözümleri sayfamızda anlattık.

Docker Desktop, Docker Engine ve lisans

Docker'ı kurumda yaygınlaştırmadan önce lisansa da bakmak gerekiyor. Docker'ın lisans sayfasına göre Docker Desktop; 250'den az çalışanı ve 10 milyon dolardan az yıllık geliri olan küçük işletmeler, kişisel kullanım, eğitim ve ticari olmayan açık kaynak projeler için ücretsiz. Daha büyük kuruluşlarda profesyonel kullanım ve kamu kurumları için ücretli abonelik gerekiyor; Docker Engine gibi açık kaynak projelerin lisans ve dağıtım koşulları ise değişmiyor.

Sık sorulan sorular

Docker ne demek? Docker, uygulamaları container adı verilen yalıtılmış birimler hâlinde paketleyip çalıştırmaya yarayan açık bir platformun adı.

Docker ne işe yarar? Uygulamayı ihtiyaç duyduğu her şeyle birlikte paketleyip geliştirici bilgisayarında, test sunucusunda ve üretimde aynı biçimde çalıştırmaya yarar.

Docker ile sanal makine arasındaki fark nedir? Sanal makine kendi çekirdeği ve sürücüleriyle eksiksiz bir işletim sistemi çalıştırır. Docker container'ı ise ana makinenin çekirdeğini paylaşan yalıtılmış bir süreçtir; daha hafiftir, ama yalıtımı sanal makinedeki kadar güçlü değildir.

Docker ile Kubernetes arasındaki fark nedir? Docker image oluşturur ve tek bir makinede container çalıştırır. Kubernetes ise çok sayıda container'ı birden fazla sunucuda yönetir: çökenleri yeniden başlatır, erişime açar ve sürüm geçişlerini yürütür.

Docker ücretsiz mi? Docker Engine açık kaynak. Docker Desktop ise küçük işletmeler, kişisel kullanım, eğitim ve ticari olmayan açık kaynak projeler için ücretsiz; daha büyük kuruluşlarda ücretli abonelik gerekiyor.

Kaynaklar