Модуль 7 / 24
Stacks и декларативное развёртывание
Содержание
1. Цели и результат модуля
После модуля вы сможете описывать multi-service приложение декларативно, валидировать manifest, повторно применять изменения и удалять весь stack как единицу управления.
- объяснять связь stack, services, networks и configs
- отличать docker compose от docker stack deploy
- читать имена ресурсов с префиксом stack
- выполнять идемпотентный повторный deploy
2. Теория: stack как набор ресурсов
Stack — именованный набор Swarm services, networks, configs и secrets, созданный из Compose-подобного manifest. Stack не является отдельным runtime-объектом: docker stack ls агрегирует ресурсы по namespace labels.
Имя swarm-m07 превращает web в swarm-m07_web, а app — в swarm-m07_app. Этот namespace позволяет управлять связанными ресурсами, но требует уникальных stack names.
3. Теория: Compose и stack deploy
docker compose управляет containers одного Engine. docker stack deploy отправляет Swarm service specs manager. Секция deploy имеет смысл для Swarm: replicas, update_config, rollback_config, placement и resources.
Stack deploy не строит image из build и не реализует все возможности современного Compose Specification. Для кластера публикуют image в registry и указывают доступный всем nodes immutable reference.
4. Теория: декларативное обновление
Повторный deploy вычисляет различия manifest и текущих service specs. Неизменённые ресурсы сохраняются, изменённые приводятся к новому desired state. Удалённый из manifest service может потребовать явного контроля результата.
Флаг --detach=false ждёт convergence и делает лабораторный результат наблюдаемым. Перед deploy команда stack config нормализует и проверяет manifest без изменения кластера.
5. Методические указания
- Храните manifest на управляющей машине под контролем версий, но не секреты
- Перед изменением выполняйте stack config
- Используйте фиксированный stack name
- Проверяйте stack services и stack ps после каждого deploy
- Не применяйте docker compose up к Swarm manifest как замену orchestrator
- Cleanup начинайте с stack rm и дождитесь удаления overlay network
6. Лабораторная работа: подготовка manifest
Создайте временный manifest на devops-vm. Команда printf является исполняемой и формирует два сервиса и overlay network; затем файл копируется только на manager-2.
mkdir -p /tmp/swarm-m07
printf '%s
' 'services:' ' web:' ' image: nginx:1.29-alpine' ' deploy:' ' replicas: 2' ' update_config:' ' parallelism: 1' ' networks: [app]' ' probe:' ' image: alpine:3.22' ' command: ["sleep", "3600"]' ' networks: [app]' 'networks:' ' app:' ' driver: overlay' > /tmp/swarm-m07/stack.yaml
scp /tmp/swarm-m07/stack.yaml swarm-manager-2:/tmp/swarm-m07-stack.yaml7. Лабораторная работа: validate и deploy
Сначала выведите нормализованную модель, затем разверните stack. Ожидаются web 2/2, probe 1/1 и сеть swarm-m07_app со scope swarm.
ssh swarm-manager-2 docker stack config --compose-file /tmp/swarm-m07-stack.yaml
ssh swarm-manager-2 docker stack deploy --detach=false --compose-file /tmp/swarm-m07-stack.yaml swarm-m07
ssh swarm-manager-2 docker stack ls
ssh swarm-manager-2 docker stack services swarm-m07
ssh swarm-manager-2 docker stack ps swarm-m07
ssh swarm-manager-2 docker network ls --filter name=swarm-m078. Лабораторная работа: повторный deploy
Измените число web replicas с двух до трёх и примените тот же stack name. Сервисы сохраняют identity, а orchestrator создаёт только недостающий slot.
sed -i 's/replicas: 2/replicas: 3/' /tmp/swarm-m07/stack.yaml
scp /tmp/swarm-m07/stack.yaml swarm-manager-2:/tmp/swarm-m07-stack.yaml
ssh swarm-manager-2 docker stack deploy --detach=false --compose-file /tmp/swarm-m07-stack.yaml swarm-m07
ssh swarm-manager-2 docker stack services swarm-m07
ssh swarm-manager-2 docker stack ps swarm-m079. Диагностика
Ошибки разделяйте на parsing manifest, создание service spec, image pull и runtime task. stack ps --no-trunc связывает ошибку с node и task history.
ssh swarm-manager-2 docker stack config --compose-file /tmp/swarm-m07-stack.yaml
ssh swarm-manager-2 docker stack ps swarm-m07 --no-trunc
ssh swarm-manager-2 docker service inspect swarm-m07_web --pretty
ssh swarm-manager-2 docker service logs swarm-m07_web- unsupported option — проверьте поддержку поля stack deploy
- No such image — образ должен быть доступен каждому назначенному node
- Pending — исследуйте placement и resources
- сеть не удаляется сразу — дождитесь завершения tasks
10. Контроль, критерии освоения и cleanup
- Является ли stack отдельным runtime-объектом?
- Как формируются имена ресурсов?
- Почему build непригоден для stack deploy?
- Что проверяет stack config?
- Почему повторный deploy сохраняет service ID?
- Чем stack rm отличается от удаления одного service?
Модуль освоен, если вы валидируете manifest, разворачиваете два сервиса, меняете replicas повторным deploy и подтверждаете полный cleanup.
ssh swarm-manager-2 docker stack rm swarm-m07
ssh swarm-manager-2 docker stack ls
ssh swarm-manager-2 docker service ls
ssh swarm-manager-2 docker network ls --filter name=swarm-m07
ssh swarm-manager-2 rm -f /tmp/swarm-m07-stack.yaml
rm -f /tmp/swarm-m07/stack.yaml
rmdir /tmp/swarm-m07