Docker Swarm: кластер контейнеров
Docker Compose запускает контейнеры на одной машине. Docker Swarm — на кластере из нескольких хостов, с отказоустойчивостью и балансировкой нагрузки.
Зачем Swarm
Один сервер — единая точка отказа. Упал хост → всё приложение недоступно. Swarm распределяет контейнеры по нескольким машинам:
- Если нода падает — Swarm перезапускает контейнеры на других нодах
- Балансировка нагрузки между репликами встроена
- Rolling updates без даунтайма
Менеджеры и воркеры
┌─────────────────────────────────────────────┐
│ Swarm Cluster │
│ │
│ ┌──────────────┐ ┌──────────┐ ┌──────┐ │
│ │ Manager │ │ Worker │ │Worker│ │
│ │ (Leader) │ │ │ │ │ │
│ │ ● API │ │ ○ Tasks │ │○Tasks│ │
│ │ ● Scheduler │ │ │ │ │ │
│ │ ● Raft log │ │ │ │ │ │
│ └──────────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────────┘
Менеджер — управляет кластером: принимает команды, распределяет задачи, хранит состояние в Raft-логе. Может также запускать контейнеры.
Воркер — только запускает контейнеры (tasks). Не участвует в управлении.
Raft и кворум
Менеджеры используют Raft consensus для синхронизации состояния. При потере кворума кластер переходит в read-only.
| Менеджеров | Допустимых потерь |
|---|---|
| 1 | 0 |
| 3 | 1 |
| 5 | 2 |
| 7 | 3 |
Для продакшна минимум — 3 менеджера. Нечётное число предотвращает split-brain.
Попробуй в симуляции
Инициализация кластера
# На первом сервере (станет менеджером)
docker swarm init --advertise-addr <IP>
# Вывод:
# docker swarm join --token SWMTKN-1-abc123... <MANAGER-IP>:2377# На каждом воркере — вставить команду из вывода init
docker swarm join --token SWMTKN-1-abc123... 192.168.1.10:2377# Проверить кластер
docker node ls
# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
# abc123 * manager-1 Ready Active Leader
# def456 worker-1 Ready Active
# ghi789 worker-2 Ready ActiveПорты Swarm
2377/tcp # управление кластером (только между менеджерами)
7946/tcp # коммуникация нод
7946/udp # коммуникация нод
4789/udp # overlay network трафикОткрой эти порты в файрволе между нодами.
Управление нодами
docker node ls # список нод
docker node inspect <node> # детали
docker node update --availability drain worker-1 # вывести из ротации (деплой)
docker node update --availability active worker-1 # вернуть
# Добавить метки (для scheduling constraints)
docker node update --label-add env=prod manager-1
docker node update --label-add role=db worker-2
# Покинуть кластер (на воркере)
docker swarm leave
# Удалить ноду (на менеджере)
docker node rm worker-2Токены
# Посмотреть токены (на менеджере)
docker swarm join-token worker # токен для воркеров
docker swarm join-token manager # токен для менеджеров
# Ротация токена (если скомпрометирован)
docker swarm join-token --rotate workerВ следующем уроке — services: как запускать и масштабировать приложения в Swarm.