What is Docker Swarm?

Docker Swarm, Docker’ın yerleşik (native) container orkestrasyon çözümüdür. Birden fazla Docker host’unu tek bir cluster (küme) gibi yönetmeni sağlar. Amacı, Container’ları yüksek erişilebilir, ölçeklenebilir, hata toleranslı şekilde çalıştırmaktır. Kısaca tek sunucu yerine, birden fazla sunucuyu tek Docker gibi kullanmak. 

Docker Swarm, Docker tarafından geliştirilmiştir ve Kubernetes’e göre daha hafif ve kolay bir alternatiftir. 

Docker Engine kuruluysa, Swarm ayrıca kurulmaz.

Swarm düzgün çalışsın diye node’lar arası şu portlar açık olmalıdır:

Port Protokol Açıklama
2377 TCP Swarm management (manager ↔ node)
7946 TCP/UDP Node discovery & gossip
4789 UDP Overlay network (VXLAN)
  • Manager node’larda: 2377 + 7946 + 4789
  • Worker node’larda: 7946 + 4789

Docker Swarm Mimarisi

  • Cluster yönetimini yapar
  • State (durum) bilgisini tutar
  • Service, task, network kararlarını verir
  • Raft consensus kullanır
  • Sadece container çalıştırır
  • Yönetim kararlarına katılmaz
  • Manager’dan komut alır

Ortamda 3 veya 5 Manager olması gerekir. Nedeni ise, Docker Swarm, Raft consensus kullanır. Raft ise karar alabilmek için çoğunluk (quorum) gerekir.

Manager Sayısı Tolerans
1 0 hata
3 1 manager düşme hakkı var.
5 2 manager düşme hakkı var.

Docker swarm, her zaman tek sayı önerilir. Sebebi ise kullanılan algoritmanın Quorum olmasıdır. Raft algoritması %50 + 1 ister. Buda karar alırken çoğunluğu sağlaması için hep tek rakama çıkar. Yani, Çift sayı daha fazla kaynak olsada size hiçbir kazanç sağlamaz.

Manager Çoğunluk
2 ❌ Riskli
3
4 ❌ Gereksiz
5
  • Çalışan container’lar başka worker’a taşınır ve hizmet kesintisi minimum olur.
  • Çoğunluk varsa: Cluster çalışmaya devam eder
  • Çoğunluk yoksa: Yeni servis oluşturamazsın, var olan container’lar çalışmaya devam eder ve yönetim kilitlenir. (read-only)

Örnek, 3 manager var ve 2 tanesi giderse Cluster yönetilemez. Çünkü gerekli quorum için en az 2 manager gereklidir.

  • Manager node’larda uygulama çalıştırması önerilmez.
  •  Manager’ları farklı fiziksel sunuculara dağıtması gerekir.
  • Backup + docker swarm join-token saklanması hayat kurtarır.

Docker Swarm 

Yukarıda bilgileri iyice okuduktan sonra artık uygulamaya geçebiliriz. Ben docker swarm ortamını kurmakla zaman kaybetmeyip https://labs.play-with-docker.com/ linki üzerinden devam edeceğim. Bu bize 2 saat lab ortamı sağlıyor. Login olduktan sonra sol tarafta bulunan ADD NEW INSTANCE butonuna tıklayarak 5 tane makina oluşturalım. Biz bu 5 makinadan 3 tanesini manager 2 tanesini ise worker olarak yapılandıracağız.

 Docker Engine kuruluysa, Swarm ayrıca kurulmaz diye söylemiştik. Swarm aktif etmemiz için yapmamız gereken tek şey aşağıdaki komut çalıştırmak. Bu komutla, mevcut node Manager olur ve Cluster oluşturulur. Diğer node’lar worker olarak sonradan eklenebilir.

İlk olarak node1 makinasını Manager olarak yapılandıracağım için aşağıdaki komutu çalıştırıyorum. 

  • docker swarm init komutu Manager için yeterlidir. Ancak makina üzerinde birden fazla ağ ve ip var ise karışmaması için bunu belirtebiliriz.
docker swarm init --advertise-addr node1_ip_addr

Çıkan sonuçta swarm modun aktif olduğunu görebilirsiniz. Bu sayede ilk docker swarm manager elde etmiş olduk. İkinci adımda ise yapmamız gereken manager veya worker eklemek. Bunu nasıl yapacağımızıda zaten ekranda yazıyor.

  • Worker eklemek için, docker swarm join --token xxxxxxx. ile devam eden kısım.
  • Manager eklemek için docker swarm join-token manager komutunu çalıştırarak öğrenebiliriz. Sonuç olarak oda aynı komut sadece token id farklı olacaktır.

Çıkan sonucu olarak node2 ve node3 de manager olarak ayarlayalım.

Node4 ve node5 ise ilgili komutu alarak worker olarak ekleyelim.

Cluster yapımızı görmek için aşağıdaki komutu çalıştırmamız yeterli olacaktır.

docker node ls 

Docker Swarm Mode aktif edildiğinde, Docker tek makine mantığından çıkar ve cluster mantığıyla çalışmaya başlar. Bundan sonra, Docker iki farklı çalışma modelini aynı anda destekler:

  • Standalone Container Mode (docker container create)
  • Swarm Service Mode (docker service create)

Swarm açıldı diye eski komutlar kapanmaz, fakat kullanım amacı değişir.

Temel Fark Tablosu
Özellik container create service create
Swarm scheduler
Failover
Replica
Load balancing
Service discovery
Cluster aware
Production uygunluğu

Sonuç olarak, Docker Swarm Mode aktifken docker container create hâlâ çalışır, ancak cluster mantığı ve yüksek erişilebilirlik için doğru ve önerilen yöntem docker service create kullanmaktır.

Docker Swarm’ta docker_gwbridge ve ingress Network’leri Nedir?

Docker Swarm Mode aktif edildiğinde, Docker otomatik olarak iki adet özel network oluşturur. Bu network’ler Swarm’ın node’lar arası iletişim, servis erişimi ve yük dengeleme mekanizmasının temelini oluşturur. 

  • Sadece node içinde vardır
  • Overlay network’lerin dış dünya ile çıkış kapısıdır.
  • NAT ve routing işlemlerini sağlar
  • Docker tarafından otomatik yönetilir
  • Overlay network’teki container’ların, internete çıkabilmesini ve host ağına erişebilmesini sağlar.
  • Servisler varsayılan otomatik olarak ingress overlay network’üne bağlanır.
  • Tüm node’lar arasında overlay (VXLAN) ile çalışır
  • Load balancing bu network üzerinden yapılır
  • Servislerin dış dünyaya açıldığı kapıdır
  • Sadece port publish edilen servisler için kullanılır ve Swarm’ın routing mesh mekanizmasının temelidir

İsteğe bağlı olarak özel overlay network'ler aşağıdaki örneğe bakılarak oluşturulabilir. 

Sadece ingress ağı kullanılırsa tüm container'lar aynı ağ'a bağlandığı için birbirleriyle haberşecek duruma gelecektir. Buda prod ortamlarda önerilen bir çözüm değildir.

docker network create \
  --driver overlay \
  my-overlay 

Docker Swarm’ta Replicated ve Global Nedir?

Docker Swarm, servisleri cluster üzerinde çalıştırırken iki farklı deployment (çalıştırma) modu sunar:

  • Replicated
  • Global

Bu iki kavram, bir servisin kaç kopya (container) ile ve hangi node’larda çalışacağını belirler. Yanlış mod seçimi, kaynak israfına ya da servis eksikliğine yol açabilir.

Replicated, bir servisin belirlediğin sayıda kopyasının (replica) Swarm cluster’ında çalıştırılmasıdır.

  • Sen “kaç tane” çalışacağını söylersin
  • Swarm scheduler bu container’ları uygun node’lara dağıtır
  • Bir replica düşerse, Swarm yenisini başlatır
  • Web uygulamaları
  • API servisleri
  • Stateless microservice’ler
  • Load balanced servisler
  • Ölçeklenebilir
  • Yük dengeleme otomatik
  • Kaynak kullanımı kontrollü
Örnek
docker service create \
 --name web \
 --replicas 3 \
 nginx:1.25 

Bu durumda:

  • Toplam 3 container çalışır
  • Aynı node’da ya da farklı node’larda olabilir
  • Node düşerse replica başka node’da yeniden oluşur.

Global, servisin Swarm cluster’ındaki her node’da tam 1 adet çalıştırılmasıdır.

  • Replica sayısı vermezsin
  • Swarm her node’a 1 container koyar
  • Yeni node eklenirse otomatik başlar
  • Node silinirse container da silinir
  • Log agent’ları
  • Monitoring agent’ları
  • Security / antivirus agent’ları
  • Node-level servisler
  • Prometheus node exporter
  • Filebeat
  • Falco
  • Custom health agent’lar
Örnek
docker service create \
  --name agent \
  --mode global \
  my-monitoring-agent 

Bu durumda:

  • Cluster’da 5 node varsa → 5 container
  • 10 node olursa → 10 container

Docker Service Scale Nedir ve Ne işe Yarar? 

Bir servisin aynı anda birden fazla kopya ile çalıştırılmasına scaling (ölçekleme) denir. Docker Swarm’ta bu işlem docker service scale komutu ile yapılır. Scale, bir replicated service için çalışan replica (container) sayısını artırmak veya azaltmak için kullanılır.

  • Trafik artışı
  • Kampanya / yoğun saatler
  • Test yükleri
  • Performans denemeleri
  • Stateful uygulamalar (DB gibi)
  • Global servisler
  • Node-level agent’lar
  • Bu komut, servisi durdurmadan canlı sistem üzerinde ölçekleme yapar.
  • Global Servislerde Service Scale Çalışmaz
Örnek

Aşağıdaki komut ile web adlı servisin canlı olarak replica sayısını 5 yapar. Eğer servis daha önce 2 replica ise Swarm 3 yeni container başlatır.

docker service scale web=5

Aşağıdaki komut ile yine tam tersi olarak, fazla olan container’lar kontrollü şekilde kapatılır ve trafik diğer replica’lara yönlendirilir.

docker service scale web=1 

Service Update ve Rollback Nedir?

Modern sistemlerde uygulamaları durdurmadan güncellemek kritik bir ihtiyaçtır. Docker Swarm bu problemi rolling update ve rollback mekanizmaları ile çözer.

Bu sayede:

  • Yeni versiyona geçebilir,
  • Sorun çıkarsa saniyeler içinde geri dönebilir,
  • Kullanıcılar kesinti yaşamaz.
  • Tüm container’ları aynı anda güncellemek → Servis kesilir.
  • Healthcheck olmadan update yapmak → Swarm container’ın sağlıklı olup olmadığını anlayamaz.
  • Rollback planı olmadan production update → Risklidir.
Örnek

Diyelim ki servisiniz web → nginx:1.25  yeni sürüme geçmek istiyoruz. Aşağıdaki komutu çalıştırırsanız, Swarm burada container’ları tek tek değiştirir ve hepsini aynı anda kapatmaz.

docker service update \
  --image nginx:1.26 \
  web 
  • Update’in nasıl yapılacağını belirleyebilirsin. Aynı anda kaç container değişeceğini --update-parallelism 2 parametresi ile belirleyebilirsiniz.
  •  
  • İki update arası bekleme süresi için --update-delay 10s parametresi ile belirleyebilirsiniz.
Örnek
docker service update \
  --image nginx:1.26 \
  --update-parallelism 1 \
  --update-delay 5s \
  web

Update Sırasında Sorun Çıkarsa, Yeni container, başlamazsa, Crash olursa, Healthcheck geçmezse Swarm update’i fail sayar. Bu noktada iki seçeneğin var:

  • Manuel rollback
  • Otomatik rollback

Rollback Nedir?

Rollback, servisi bir önceki çalışan versiyonuna geri döndürür. En güzel tarafı, eski image zaten bilindiği için dönüş çok hızlıdır.

docker service rollback web

Versiyon geçmişini, eski task’ları, hangi node’da çalıştığını ve hata durumlarını görmek için aşağıdaki komutu çalıştırmanız yeterli olur.

docker service ps web 
docker service update \
  --image nginx:1.26 \
  --update-failure-action rollback \
  web

Docker Secret Nedir?

Gerçek sistemlerde uygulamalar veritabanı şifreleri, API anahtarları, TLS sertifikaları, Token’lara ihtiyaç duyarlar. Bu bilgileri, image içine gömmek, environment variable olarak vermek, düz dosya tutmak güvenlik açısından ciddi risk yaratır. Docker Swarm bu problemi Docker Secret mekanizması ile çözer.

Secret’lar sadece manager node’larda, Raft log içinde şifreli tutulur. Worker node üzerinde, sadece o servise ait secretlar yer alır ve container durunca secret silinir.

Secret Oluşturmak için aşağıdaki komutu kullanmanız yeterlidir. Bir DB şifresi oluşturalım.

echo "SuperPassword123" | docker secret create db_pass -

Dosya ile secret oluşturmak için aşağıdaki komutu kullanabilirsiniz. Bu yöntem genellikle, SSL sertifikaları, Lisans dosyaları için kullanılır.

docker secret create tls_cert server.crt

Kontrol etmek için.

docker secret ls 

Servise Secret Eklemek için aşağıdaki komutu kullanmanız yeterli olur.

docker service create \
  --name myapp \
  --secret db_pass \
  nginx

Secret’lar container içinde /run/secrets/ şu dizinde mount edilir. Uygulama /run/secrets/db_pass dosyasını okuyarak şifreyi alır.

Docker secret dinamik olarak güncellenemez. Aşağıdaki gibi yeni versiyon oluşturman gerekir.

docker secret create db_pass_v2 newpass.txt

Sonra servisi update edersin.

docker service update \
  --secret-rm db_pass \
  --secret-add db_pass_v2 \
  myapp

Eğer hiçbir servis kullanmıyorsa aşağıdaki gibi docker secret silinebilir.

docker secret rm db_pass
Blog'a Dön