Docker Swarm
1Docker Swarm: кластер контейнеров← вы здесь2Services: масштабирование и rolling updates3Stack deploy: продакшн на Swarm
Урок 1~9 минут

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.

МенеджеровДопустимых потерь
10
31
52
73

Для продакшна минимум — 3 менеджера. Нечётное число предотвращает split-brain.

Попробуй в симуляции

Инициализация кластера

bash
# На первом сервере (станет менеджером)
docker swarm init --advertise-addr <IP>
 
# Вывод:
# docker swarm join --token SWMTKN-1-abc123... <MANAGER-IP>:2377
bash
# На каждом воркере — вставить команду из вывода init
docker swarm join --token SWMTKN-1-abc123... 192.168.1.10:2377
bash
# Проверить кластер
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

bash
2377/tcp   # управление кластером (только между менеджерами)
7946/tcp   # коммуникация нод
7946/udp   # коммуникация нод  
4789/udp   # overlay network трафик

Открой эти порты в файрволе между нодами.

Управление нодами

bash
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

Токены

bash
# Посмотреть токены (на менеджере)
docker swarm join-token worker    # токен для воркеров
docker swarm join-token manager   # токен для менеджеров
 
# Ротация токена (если скомпрометирован)
docker swarm join-token --rotate worker

В следующем уроке — services: как запускать и масштабировать приложения в Swarm.

Swarm превращает несколько Docker-хостов в один кластер. Менеджеры управляют кластером, воркеры запускают контейнеры.
🐝
Docker Swarm — кластер нод
✓ Кворум
Выключай ноды и смотри как Swarm перераспределяет задачи
manager-1LEADER
manager
🐳 2 задачи
worker-1
worker
🐳 3 задачи
worker-2
worker
🐳 3 задачи
Менеджеров: 1/1  ·  Кворум при 1+ менеджерах
🎯
Миссия 1 из 3
Какой командой инициализировать новый Swarm?