25. Docker Swarm
Docker Swarm — встроенный инструмент оркестрации контейнеров в Docker. Он позволяет управлять кластером Docker-хостов как единым виртуальным Docker Engine. Проще Kubernetes, но менее функционален.
Инициализация Swarm-кластера
Заголовок раздела «Инициализация Swarm-кластера»# На первом узле (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Сервисы в Swarm
Заголовок раздела «Сервисы в Swarm»# Создать сервисdocker service create \ --name web \ --replicas 3 \ --publish published=80,target=80 \ nginx:alpine
# Список сервисовdocker service ls
# Подробности сервисаdocker service ps webdocker 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 webDocker Stack: Compose для Swarm
Заголовок раздела «Docker Stack: Compose для Swarm»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# Развернуть stackdocker 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-2Swarm vs Kubernetes
Заголовок раздела «Swarm vs Kubernetes»| Функция | Docker Swarm | Kubernetes |
|---|---|---|
| Сложность | Простой | Сложный |
| Масштаб | Сотни узлов | Тысячи узлов |
| Настройка | Минуты | Часы/дни |
| Экосистема | Ограниченная | Огромная |
| Auto-scaling | Нет | Да (HPA) |
| Storage | Ограничено | Обширно |