DevOps & CI/CD

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-сервер