Развёртывание стеков
TL;DR:
docker stack deploy -c compose.yaml myapp— деплой стека в Swarm. Compose-файл + Swarm = декларативный production-деплой с rolling updates.
Стек (Stack) — это декларативное описание всего приложения (сервисы, сети, тома, секреты) в одном файле.
Отличия от Docker Compose
Команда docker stack deploy использует стандартный файл docker-compose.yml, но:
- Игнорирует директиву
build(образы должны быть заранее собраны и отправлены в Registry). - Использует секцию
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Основные команды
- Запуск/Обновление:
docker stack deploy -c docker-compose.yml myapp - Список сервисов:
docker stack services myapp - Удаление:
docker stack rm myapp
Типичные ошибки
| Ошибка | Симптом | Решение |
|---|---|---|
build: в compose для Swarm | unsupported config option: build | Swarm не собирает образы. Пушить в registry, использовать image: |
Нет --with-registry-auth | Воркеры не могут pull private images | docker 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 |