Tek bir sunucuda birkaç container çalıştırmak docker run veya Docker Compose ile kolayca yönetilebilir. Ama trafiğiniz büyüyüp tek makine yetmemeye başladığında, “bu container’ları birden fazla sunucuya nasıl dağıtırım, biri çökerse ne olur?” sorusu ortaya çıkar. İşte bu noktada devreye orkestrasyon araçları girer — ve Docker’ın kendi çözümü Docker Swarm‘dır.
Orkestrasyon nedir, neden gerekir?
Orkestrasyon, birden fazla sunucuya (node) yayılmış container’ların nerede çalışacağına, kaç kopya (replica) olacağına, biri çöktüğünde nasıl yeniden başlatılacağına ve trafiğin bu kopyalar arasında nasıl dağıtılacağına otomatik olarak karar veren bir yönetim katmanıdır. Elle “şu container’ı şu sunucuda başlat” demek yerine, istediğiniz son durumu (“bu servisin her zaman 3 kopyası çalışsın”) tanımlarsınız; orkestratör bu durumu sürekli sağlamaya çalışır.
Docker Swarm’ın mimarisi
Docker Swarm, Docker Engine’in içine gömülü olarak gelir — ayrı bir kurulum gerektirmez. Bir küme (cluster) iki tür node’dan oluşur:
- Manager node: Kümenin durumunu tutar, hangi container’ın nerede çalışacağına karar verir (scheduling), diğer node’ları izler. Güvenilirlik için genellikle 3 veya 5 manager (tek sayı) çalıştırılır.
- Worker node: Manager’dan aldığı görevleri (task) çalıştırır — yani asıl container’lar burada koşar. Bir manager aynı zamanda worker görevi de görebilir.
Küme oluşturmak
Bir Swarm kümesi başlatmak tek komutla olur:
# İlk sunucuda (manager olacak)
docker swarm init --advertise-addr 10.0.0.1
# Çıktıda verilen "docker swarm join" komutunu
# diğer sunucularda çalıştırarak worker olarak kümeye katın
docker swarm join --token SWMTKN-1-xxxxxxxx 10.0.0.1:2377
Service: Swarm’da container yerine “servis” tanımlarsınız
Tek makinede docker run ile bir container başlatırsınız; Swarm’da ise bir service tanımlarsınız — “bu imajdan her zaman şu kadar kopya çalışsın” isteğidir:
docker service create \
--name web \
--replicas 3 \
--publish 8080:80 \
nginx:1.27
# Kaç kopya çalışıyor, hangi node'larda görün
docker service ps web
Bu komuttan sonra Swarm, nginx imajından 3 kopyayı kümedeki uygun worker node’lara otomatik olarak dağıtır. Bir node çökerse, Swarm eksik kalan kopyaları başka bir node’da yeniden başlatarak istenen 3 kopya durumunu otomatik olarak korur — buna self-healing (kendini iyileştirme) denir.
Ölçeklemek tek komut
# 3 kopyadan 8 kopyaya çık
docker service scale web=8
# Yeni bir sürümü kademeli olarak (rolling update) dağıt
docker service update --image nginx:1.28 web
Rolling update, tüm kopyaları aynı anda değil, sırayla günceller — böylece güncelleme sırasında servis kesintisiz kalır. Bir güncelleme hatalıysa docker service rollback web ile bir önceki sürüme anında dönebilirsiniz.
Swarm mu, Kubernetes mi?
Docker Swarm’ın en büyük avantajı basitliğidir: Docker Engine’de zaten yüklü gelir, öğrenme eğrisi düşüktür ve küçük-orta ölçekli projeler için yeterlidir. Kubernetes ise çok daha büyük bir ekosisteme, daha esnek yapılandırma seçeneklerine ve daha geniş endüstri desteğine sahiptir ama öğrenmesi de kurulumu da daha karmaşıktır. İkisini yan yana karşılaştıran detaylı yazımıza Karşılaştırmalar bölümünden ulaşabilirsiniz.
Orkestrasyonun ne işe yaradığını gördünüz — sıradaki yazıda bugün en yaygın kullanılan orkestrasyon aracı olan Kubernetes’in temel kavramlarını (Pod, Deployment, Service) sıfırdan ele alıyoruz.