Swarm ― это простой инструмент от Docker для создания и управления кластерами. Он помогает запускать контейнеры на нескольких машинах, следить за их работой и при необходимости добавлять новые ресурсы. Далее расскажем, как настроить Docker Swarm и удобно управлять кластерами.
Предварительная настройка
Мы будем развертывать Docker Swarm на серверах с Ubuntu 24.04 LTS. Перед началом настройки кластера необходимо:
- Установить Docker на все серверы.
- Настроить разрешение имен между узлами. Для тестовой среды добавьте записи в /etc/hosts на каждом сервере:
|
1 |
sudo nano /etc/hosts |
У нас будут 3 машины со следующими IP, так что выдадим им следующие имена:
|
1 2 3 |
10.0.0.10 manager 10.0.0.11 worker01 10.0.0.12 worker02 |
В продуктивной инфраструктуре рекомендуется использовать внутренний DNS.
- Настроить брандмауэр. Если используется iptables, выполните на всех узлах:
|
1 2 3 4 |
sudo iptables -I INPUT -p tcp --dport 2376 -j ACCEPT sudo iptables -I INPUT -p tcp --dport 7946 -j ACCEPT sudo iptables -I INPUT -p udp --dport 7946 -j ACCEPT sudo iptables -I INPUT -p udp --dport 4789 -j ACCEPT |
На manager дополнительно откройте порт 2377:
|
1 |
sudo iptables -I INPUT -p tcp --dport 2377 -j ACCEPT |
При развертывании кластера в облаке убедитесь, что аналогичные правила добавлены в панели управления провайдера.
Если вы планируете разворачивать кластер в облаке, стоит обратить внимание на облачные решения от Рег.облака. Это удобный вариант для быстрого запуска виртуальных серверов, масштабирования ресурсов под нагрузку и гибкой конфигурации сети.

Инициализация кластера на хосте управления
Перейдите на сервер, который будет выполнять роль управляющей ноды (в нашем примере ― 10.0.0.10).
- Инициализируйте кластер Docker Swarm:
|
1 |
sudo docker swarm init --advertise-addr 10.0.0.10 |
Параметр --advertise-addr указывает IP-адрес, по которому другие ноды будут подключаться к управляющему узлу.
Docker выведет сообщение об успешной инициализации и сгенерирует команду для подключения воркер-нод. Она будет выглядеть примерно так:
|
1 |
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxx 10.0.0.10:2377 |
Скопируйте эту команду ― она потребуется для добавления рабочих серверов в кластер.
- Проверьте состояние кластера:
|
1 |
sudo docker node ls |
В списке отобразится текущий узел со статусом Ready и ролью Leader.
- При необходимости получите токен повторно.
Чтобы добавить воркер-ноду, пропишите:
|
1 |
sudo docker swarm join-token worker |
Добавить управляющие ноды:
|
1 |
sudo docker swarm join-token manager |
Подключение к кластеру воркеров
Теперь нужно подключить рабочие узлы (worker01 ― 10.0.0.11, worker02 ― 10.0.0.12).
- На управляющем сервере получите команду подключения для воркер-нод:
|
1 |
sudo docker swarm join-token worker |
Вывод будет следующим:
|
1 |
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxx 10.0.0.10:2377 |
- Перейдите на каждый рабочий сервер и выполните полученную команду:
|
1 |
sudo docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxx 10.0.0.10:2377 |
Если соединение настроено корректно и порты открыты, узел будет добавлен в кластер.
- Проверьте подключение на manager:
|
1 |
sudo docker node ls |
В списке должны отобразиться все ноды со статусом Ready. Роль воркер-узлов будет указана как Worker, а управляющий сервер останется Leader.

Создание стека с сервисами
В Docker Swarm приложения обычно разворачиваются в виде стеков. Стек описывается в YAML-файле формата Docker Compose и может включать несколько взаимосвязанных сервисов.
- Создайте файл stack.yml на управляющем узле:
|
1 |
nano stack.yml |
Пример конфигурации:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: “3.9” services: web: image: nginx:latest ports: - “8080:80” deploy: replicas: 2 restart_policy: condition: on-failure redis: image: redis:7 deploy: replicas: 1 |
В этом примере мы развернули веб-сервис на базе Nginx с двумя репликами и сервис Redis.
- Разверните стек в кластере:
|
1 |
sudo docker stack deploy -c stack.yml mystack |
Где mystack ― имя создаваемого стека.
- Проверьте развернутые сервисы:
|
1 |
sudo docker stack services mystack |
И список запущенных контейнеров в рамках стека:
|
1 |
sudo docker stack ps mystack |
Docker Swarm автоматически распределит реплики сервисов между доступными worker-нодами. Если один из узлов откажет, контейнеры будут перезапущены на других серверах кластера в соответствии с заданной политикой.
Пример полезных команд
| Команда | Описание |
|---|---|
| docker node ls | Выводит список всех нод кластера |
| docker node inspect <нода> | Отображает подробную информацию о выбранной ноде |
| docker service ls | Показывает список всех сервисов |
| docker service ps <сервис> | Отображает задачи сервиса и их размещение по нодам |
| docker service logs <сервис> | Выводит логи сервиса |
| docker stack ls | Показывает список развернутых стеков |
| docker stack services <стек> | Отображает сервисы выбранного стека |
| docker stack rm <стек> | Удаляет стек и все его сервисы |
| docker swarm leave | Выполняет выход текущего узла из кластера |
| docker swarm leave --force | Принудительно удаляет управляющую ноду из кластера |
Заключение
Итак, с помощью управляющих и рабочих узлов вы можете быстро развернуть отказоустойчивую инфраструктуру, распределять нагрузку между серверами и масштабировать приложения по мере необходимости.