Docker Compose vs Single Node Swarm

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 ve docker-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.