Docker Compose vs Single Node Swarm

Docker Compose development ortamı için muhteşem bir tool, ben kendi geliştirme ortamımda da her zaman docker-compose kullanıyorum. Ancak production ortamınızda docker-compose kullanmak isterseniz tekrar düşünmeniz gerekebilir.
Aşağıda MySQL veritabanı kullanan bir Laravel projesi için en basit docker-compose.yml
yapısı bulunuyor:
version: '3'
services:
app:
tty: true
image: docker.io/bitnami/laravel:7-debian-10
environment:
- DB_HOST=mysql
- DB_USERNAME=my_user
- DB_DATABASE=my_database
- DB_PASSWORD=my_password
depends_on:
- mysql
ports:
- 3000:3000
volumes:
- ${PWD}:/app
mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_RANDOM_ROOT_PASSWORD=yes
- MYSQL_USER=my_user
- MYSQL_DATABASE=my_database
- MYSQL_PASSWORD=my_password
Geliştirme yaparken bu YAML dosyasını sadece docker-compose up -d
komutuyla çalıştırabilirsiniz. Aynı şekilde production ortamında da kullanabilirsiniz. Genellikle her şey doğru çalışır ancak production ortamında docker-compose kullanmak mantıklı mıdır?
docker-compose Python ile yazılan bir tool ve YAML dosyasındaki konfigürasyonları arkaplanda docker'ın anlayabileceği komutlara çevirir ve bu şekilde altyapımız hazır olur.
Single-Node Swarm nedir?
Bir Swarm cluster'ın fault-tolerance olması için 1 adet manager ve 2 adet worker olmak üzere 3 adet node kullanılması önerilir, ancak bu zorunlu değil. Sadece bir manager node ile Swarm'ın özelliklerini kullanabilirsinizs.
Aşağıdaki YAML dosyası aynı docker-composer'da verdiğimiz YAML dosyası gibi, sadece Swarm için çok küçük değişiklikler yapılmıştır.
version: '3.7'
services:
app:
tty: true
image: my-privet-registry.com/app/laravel:for-test
secrets:
- db_password
environment:
- DB_HOST=mysql
- DB_USERNAME=my_user
- DB_DATABASE=my_database
depends_on:
- mysql
ports:
- 80:3000
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
mysql:
image: mysql:8.0.21
command: --default-authentication-plugin=mysql_native_password
secrets:
- db_root_password
- db_password
environment:
MYSQL_USER: my_user
MYSQL_DATABASE: my_database
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_PASSWORD_FILE: /run/secrets/db_password
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
secrets:
db_root_password:
external: true
db_password:
external: true
docker-compose yerine single-node swarm kullanmanın avantajları nedir?
- Sadece bir komut ile Swarm aktif edilir,
docker swarm init
komutu ile bir swarm node oluşturabilirsiniz, docker-compose install/update işlemleri ile hiç uğraşmayacaksınız. - Swarm ile başlarsanız highly-available olmaya hazırsınız ve sıfırdan başlamanıza gerek kalmaz.
- Swarm'ın getirdiği ekstra özelliklerden faydalanabilirsiniz, örneğin secrets, configs, servisler auto-recovery ise, rollbacks ve healthchecks.
- Healthchecks,
docker run
vedocker-compose
hiçbir zaman size healthcheck özelliği sunmaz. Swarm ile production ortamlarınızı daha sağlıklı hale getirebilirsiniz.. - Rolling updates, Swarm'daki
docker service update
komutu size container'lerin yönetimi ve update işlemleri için yüzlerce seçenek veriyor. - Docker ve Swarm ikisi de bütünleşik. Bu nedenle production ortamınızdaki version uyumluluğu konusunda endişelenmenize gerek kalmıyor.