Docker Swarm
Встроенный в Docker оркестратор: объединяет несколько хостов в кластер и раскладывает по ним сервисы почти без обучения.
Что такое Docker Swarm
Docker Swarm (swarm mode) — режим оркестрации, встроенный в сам Docker. Несколько хостов объединяются в кластер, и Docker раскладывает по ним сервисы, следит за числом реплик, перезапускает упавшие контейнеры и балансирует трафик между ними.
Устанавливать нечего: Swarm — часть Docker Engine, включается одной командой. Это его главный аргумент против Kubernetes: если вы умеете писать compose.yaml, вы уже умеете работать со Swarm.
Позиционирование честное — Swarm занимает нишу между Docker Compose (один хост, ручное всё) и Kubernetes (любой масштаб, высокая сложность). Развивается он медленно и на переднем крае экосистемы давно проиграл, но остаётся рабочим решением для небольших кластеров из 3–10 узлов.
Как устроен кластер
- Manager-узлы хранят состояние кластера в Raft-логе и принимают решения о размещении. Их берут нечётное число (3 или 5) ради кворума: при чётном числе потеря связи парализует кластер.
- Worker-узлы просто выполняют задачи.
- Service — декларация «хочу N реплик такого образа», аналог Deployment в Kubernetes.
- Task — один запущенный контейнер сервиса.
- Overlay-сеть — виртуальная сеть поверх физической: контейнеры на разных хостах общаются по именам сервисов.
- Routing mesh — запрос на опубликованный порт любого узла попадает в сервис, даже если на этом узле реплик нет.
# на первом узле
docker swarm init --advertise-addr 10.0.0.1
# выведет команду join с токеном — выполнить на остальных
docker swarm join --token SWMTKN-1-xxx 10.0.0.1:2377
docker node ls # узлы кластера
docker node update --role manager node2
docker swarm join-token worker # показать токен ещё раз
Сервисы
docker service create --name api \
--replicas 3 \
--publish 8000:8000 \
--update-parallelism 1 --update-delay 10s \
--health-cmd "curl -f http://localhost:8000/health || exit 1" \
registry.example.com/api:1.4.2
docker service ls
docker service ps api # где какие реплики, что упало
docker service logs -f api
docker service scale api=6
docker service update --image registry.example.com/api:1.5.0 api # rolling update
docker service rollback api # откат к предыдущему образу
Rolling update в Swarm настраивается прямо флагами: --update-parallelism 1 --update-delay 10s означает «обновляй по одной реплике с паузой» — простая реализация одной из стратегий деплоя без дополнительных инструментов.
Stack: тот же compose.yaml
Главное удобство — переиспользование формата Compose. Файл почти не меняется, добавляется секция deploy:
services:
api:
image: registry.example.com/api:1.4.2
ports: ["8000:8000"]
networks: [backend]
deploy:
replicas: 3
placement:
constraints: [node.role == worker]
update_config:
parallelism: 1
delay: 10s
order: start-first # сначала поднять новую, потом убить старую
restart_policy:
condition: on-failure
resources:
limits: {cpus: '2', memory: 2G}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 10s
networks:
backend:
driver: overlay
docker stack deploy -c compose.yaml myapp
docker stack services myapp
docker stack rm myapp
Обратите внимание: build: в Swarm не работает — образ должен быть в registry, доступном всем узлам. Это первое, обо что спотыкаются при переезде с Compose.
Swarm vs Kubernetes
| Docker Swarm | Kubernetes | |
|---|---|---|
| Установка | Встроен, одна команда | Кластер, CNI, etcd — отдельный проект |
| Формат конфигов | compose.yaml | Манифесты + Helm |
| Порог входа | Часы | Недели |
| Автомасштабирование по нагрузке | Нет | HPA |
| Экосистема | Скудная | Огромная |
| Развитие | Практически заморожено | Активное |
| Разумный масштаб | 3–10 узлов | Десятки и сотни |
Выбор прагматичный: Swarm — когда нужен отказоустойчивый запуск десятка сервисов на нескольких VPS и в команде нет выделенного инженера под кластер. Kubernetes — когда сервисов и людей много, нужны автомасштабирование, богатые политики и вся экосистема вокруг.
Секреты и данные
Swarm умеет то, чего нет в Compose: docker secret — зашифрованное хранение паролей в Raft-логе, монтируется в контейнер файлом в /run/secrets/, в переменные окружения и логи не попадает.
Слабое место — состояние. Общего распределённого хранилища в Swarm нет: том живёт на конкретном узле, и реплика с данными к нему привязана. PostgreSQL в Swarm либо прибивают к узлу через placement.constraints, либо выносят наружу — на отдельную машину или в managed-базу.
Связанные термины
- Docker — Swarm является его частью
- Docker Compose — тот же YAML на одном хосте
- Kubernetes — более мощный оркестратор
- Docker Registry — обязателен для кластера
- контейнер — то, чем оркестратор управляет
- health check — по нему Swarm решает, жива ли реплика
Готовы запустить GPU-задачу?
Запустить GPU-сервер