Перейти к содержимому

25. Docker Swarm

Docker Swarm — встроенный инструмент оркестрации контейнеров в Docker. Он позволяет управлять кластером Docker-хостов как единым виртуальным Docker Engine. Проще Kubernetes, но менее функционален.

Окно терминала
# На первом узле (manager)
docker swarm init --advertise-addr 192.168.1.10
# Вывод:
# Swarm initialized: current node (abc123) is now a manager.
# To add a worker to this swarm, run the following command:
# docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377
# Получить токен для добавления worker-узлов
docker swarm join-token worker
# Получить токен для добавления manager-узлов
docker swarm join-token manager
# На worker-узлах (скопируйте команду из swarm init)
docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377
# Просмотр узлов кластера
docker node ls
Окно терминала
# Создать сервис
docker service create \
--name web \
--replicas 3 \
--publish published=80,target=80 \
nginx:alpine
# Список сервисов
docker service ls
# Подробности сервиса
docker service ps web
docker service inspect web
# Масштабировать сервис
docker service scale web=5
# Обновить образ (rolling update)
docker service update \
--image nginx:1.25 \
--update-parallelism 1 \ # обновлять по 1 реплике за раз
--update-delay 30s \ # пауза между обновлениями
web
# Откатить обновление
docker service rollback web
# Удалить сервис
docker service rm web
docker-stack.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: start-first # запустить новый до остановки старого
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
placement:
constraints:
- node.role == worker # только на worker-узлах
resources:
limits:
cpus: '0.5'
memory: 256M
api:
image: myapi:v1.2.3
deploy:
replicas: 2
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
secrets:
- db_password
postgres:
image: postgres:15-alpine
deploy:
replicas: 1
placement:
constraints:
- node.labels.storage == ssd # только на SSD-узлах
volumes:
- postgres_data:/var/lib/postgresql/data
secrets:
- postgres_password
volumes:
postgres_data:
driver: local
secrets:
db_password:
external: true
postgres_password:
external: true
Окно терминала
# Развернуть stack
docker stack deploy -c docker-stack.yml myapp
# Список стеков
docker stack ls
# Сервисы в стеке
docker stack services myapp
# Удалить стек
docker stack rm myapp
Окно терминала
# Вывести узел из ротации (maintenance mode)
docker node update --availability drain node-2
# Вернуть узел в ротацию
docker node update --availability active node-2
# Добавить метку к узлу
docker node update --label-add storage=ssd node-1
# Удалить worker-узел из кластера
# (сначала на узле)
docker swarm leave
# Затем на manager-е
docker node rm node-2
ФункцияDocker SwarmKubernetes
СложностьПростойСложный
МасштабСотни узловТысячи узлов
НастройкаМинутыЧасы/дни
ЭкосистемаОграниченнаяОгромная
Auto-scalingНетДа (HPA)
StorageОграниченоОбширно