Развёртывание стеков

TL;DR: docker stack deploy -c compose.yaml myapp — деплой стека в Swarm. Compose-файл + Swarm = декларативный production-деплой с rolling updates.

Стек (Stack) — это декларативное описание всего приложения (сервисы, сети, тома, секреты) в одном файле.

Отличия от Docker Compose

Команда docker stack deploy использует стандартный файл docker-compose.yml, но:

  1. Игнорирует директиву build (образы должны быть заранее собраны и отправлены в Registry).
  2. Использует секцию deploy для настроек масштабирования и размещения.

Пример Production-стека

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    networks:
      - webnet
    deploy:
      replicas: 2
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: rollback
      restart_policy:
        condition: on-failure
 
  api:
    image: my-registry/api:v1
    networks:
      - webnet
      - dbnet
    secrets:
      - db_password
    deploy:
      replicas: 3
      placement:
        constraints: [node.role == worker]
 
  db:
    image: postgres:14
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - dbnet
    secrets:
      - db_password
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  webnet:
  dbnet:
    internal: true
 
volumes:
  db-data:
 
secrets:
  db_password:
    external: true

Основные команды

  1. Запуск/Обновление:
    docker stack deploy -c docker-compose.yml myapp
  2. Список сервисов:
    docker stack services myapp
  3. Удаление:
    docker stack rm myapp

Типичные ошибки

ОшибкаСимптомРешение
build: в compose для Swarmunsupported config option: buildSwarm не собирает образы. Пушить в registry, использовать image:
Нет --with-registry-authВоркеры не могут pull private imagesdocker stack deploy --with-registry-auth
depends_on в SwarmИгнорируетсяSwarm не поддерживает depends_on. Использовать healthcheck + retry в приложении
Rolling update убивает все репликиDowntime при обновленииupdate_config: parallelism: 1, delay: 10s, order: start-first