Bir uygulamayı kendi bilgisayarınızda sorunsuz çalıştırıp meslektaşınızın makinesinde “bende çalışıyordu ama…” demek, yazılım dünyasının en eski şakalarından biridir. Docker, tam olarak bu sorunu çözmek için ortaya çıktı: bir uygulamayı, çalışması için gereken her şeyle birlikte tek bir paket haline getirip, o paketi hangi ortamda çalıştırırsanız çalıştırın aynı şekilde davranmasını sağlar.
Container nedir?
Container (konteyner), bir uygulamanın kodunu, kütüphanelerini, bağımlılıklarını ve çalışma zamanı ayarlarını tek bir izole birimde toplayan hafif bir paketleme biçimidir. “Konteyner” ismi tesadüf değil: tıpkı bir nakliye konteynerinin içine ne koyarsanız koyun, gemide, trende veya kamyonda aynı standart şekilde taşınabilmesi gibi, bir yazılım container’ı da içinde ne olursa olsun herhangi bir sunucuda aynı şekilde çalışır.
Container, sanal makineden farklı olarak kendi işletim sistemi çekirdeğini taşımaz; ana makinenin (host) çekirdeğini paylaşır. Bu da container’ları inanılmaz derecede hafif ve hızlı başlatılabilir hale getirir. Container vs VM farkını bir sonraki yazıda detaylı işliyoruz.
Docker’ın rolü ne?
Docker, container teknolojisini kullanıcı dostu hale getiren araç ve platform bütünüdür. Linux çekirdeğinde uzun süredir var olan namespaces ve cgroups gibi izolasyon mekanizmalarını, geliştiricilerin birkaç komutla kullanabileceği basit bir arayüze dönüştürdü. 2013’te açık kaynak olarak yayınlanmasından bu yana, container’ları neredeyse herkesin diline yerleştiren proje oldu.
Docker mimarisinin üç temel parçası
- Docker İmajı (Image): Uygulamanızın ve bağımlılıklarının salt-okunur bir anlık görüntüsü. Bir tarif gibi düşünebilirsiniz.
- Docker Container: İmajın çalışan bir örneği. Aynı tarifden istediğiniz kadar kopya (container) başlatabilirsiniz.
- Docker Daemon & CLI: Arka planda çalışan
dockerdservisi image’ları ve container’ları yönetir; siz dedockerkomut satırı aracıyla onunla konuşursunuz.
İlk container’ınızı çalıştırmak
Docker kurulduktan sonra, tek bir komutla resmi bir imajı indirip çalıştırabilirsiniz:
docker run --rm hello-world
Bu komut şu adımları izler: Docker önce hello-world imajının yerelde olup olmadığına bakar, yoksa Docker Hub’dan indirir, ardından bu imajdan yeni bir container başlatır. --rm bayrağı, container işini bitirince kendini otomatik silmesini sağlar.
Daha gerçekçi bir örnek olarak, bir Nginx web sunucusunu arka planda ayağa kaldıralım:
docker run -d --name ilk-sunucum -p 8080:80 nginx:alpine
Artık tarayıcınızdan localhost:8080 adresine gidip Nginx’in karşılama sayfasını görebilirsiniz — ve bu sunucu, ana makinenize hiçbir şey kurmadan, tamamen izole bir container içinde çalışıyor.
Neden önemli?
Docker’ın yaygınlaşmasının arkasındaki asıl neden, “geliştirme ortamı = production ortamı” eşitliğini pratik hale getirmesidir. Bir geliştirici kendi makinesinde çalışan container’ı, aynen production sunucusuna taşıyabilir. Bu, dağıtım (deployment) süreçlerini basitleştirir, ortam kaynaklı hataları büyük ölçüde azaltır ve mikroservis mimarilerinin önünü açar.
Sıradaki yazıda container’ların sanal makinelerden (VM) nasıl farklılaştığına, kaynak kullanımından izolasyon seviyesine kadar detaylı bakacağız.