← К программе курса

Модуль 7 / 24

Stacks и декларативное развёртывание

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете описывать multi-service приложение декларативно, валидировать manifest, повторно применять изменения и удалять весь stack как единицу управления.

  • объяснять связь stack, services, networks и configs
  • отличать docker compose от docker stack deploy
  • читать имена ресурсов с префиксом stack
  • выполнять идемпотентный повторный deploy
02

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.

03

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.

04

4. Теория: декларативное обновление

Повторный deploy вычисляет различия manifest и текущих service specs. Неизменённые ресурсы сохраняются, изменённые приводятся к новому desired state. Удалённый из manifest service может потребовать явного контроля результата.

Флаг --detach=false ждёт convergence и делает лабораторный результат наблюдаемым. Перед deploy команда stack config нормализует и проверяет manifest без изменения кластера.

05

5. Методические указания

  • Храните manifest на управляющей машине под контролем версий, но не секреты
  • Перед изменением выполняйте stack config
  • Используйте фиксированный stack name
  • Проверяйте stack services и stack ps после каждого deploy
  • Не применяйте docker compose up к Swarm manifest как замену orchestrator
  • Cleanup начинайте с stack rm и дождитесь удаления overlay network
06

6. Лабораторная работа: подготовка manifest

Создайте временный manifest на devops-vm. Команда printf является исполняемой и формирует два сервиса и overlay network; затем файл копируется только на manager-2.

terminal
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.yaml
07

7. Лабораторная работа: validate и deploy

Сначала выведите нормализованную модель, затем разверните stack. Ожидаются web 2/2, probe 1/1 и сеть swarm-m07_app со scope swarm.

terminal
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-m07
08

8. Лабораторная работа: повторный deploy

Измените число web replicas с двух до трёх и примените тот же stack name. Сервисы сохраняют identity, а orchestrator создаёт только недостающий slot.

terminal
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-m07
09

9. Диагностика

Ошибки разделяйте на parsing manifest, создание service spec, image pull и runtime task. stack ps --no-trunc связывает ошибку с node и task history.

terminal
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

10. Контроль, критерии освоения и cleanup

  • Является ли stack отдельным runtime-объектом?
  • Как формируются имена ресурсов?
  • Почему build непригоден для stack deploy?
  • Что проверяет stack config?
  • Почему повторный deploy сохраняет service ID?
  • Чем stack rm отличается от удаления одного service?

Модуль освоен, если вы валидируете manifest, разворачиваете два сервиса, меняете replicas повторным deploy и подтверждаете полный cleanup.

terminal
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