Первое что необходимо сделать при использовании Swarm с Docker это активировать Swarm, после установки самого Docker конечно.
Для начала проверяем активирован ли Swarm (по умолчанию отключен) выполнив команду:
docker info
Swarm: inactive
Для активации выполняем команду docker swarm init. Вывод команды должен быть следующий:
Swarm initialized: current node (uzypzuxnb5bwte8y34crmsm7n) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-422oqh6omvvsbjwdt2r9qxiyufm5zxa768sxow5qkmxcc4wgt3-1sbq1lijyrnryn3n3xdqzncnd 172.31.144.9:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Зачем docker swarm init
docker swarm init — это первая команда, с которой начинается развёртывание кластерной оркестрации Docker Swarm.
Команда docker swarm init запускает демон Swarm Mode на текущем Docker-хосте
и делает его менеджером (Manager Node). Manager Node может управлять кластером и запускать контейнеры.
Помимо это для этого менеджера выпускается сертификат и токен, который может быть использован в будущем для кластера (несколько Docker Swarm). Используя токен вы можете подключать другие узлы в кластер Docker Swarm.
Также создаётся новая сеть Swarm (internal), благодаря которой контейнеры, размещённые на разных хостах, могут общаться друг с другом.
Помимо всего этого Manager Node создаёт встроенную распределённую базу данных
на основе алгоритма Raft consensus. Это база хранит всё состояние кластера, автоматически синхронизируется с другими узлами Manager Node, обеспечивая консистентность (согласованность) данных. При этом не используется ни etcd, ни Consul, и конечно же эта база шифруется.
Однонодовый Docker Swarm
В боевой среде конечно необходимо использовать несколько хостов, но так это ознакомительная статья тут я создам кластер с одной нодой. В другой статье я распишу как сделать правильно.
- Сперва проверю какие хосты (node) вообще сейчас в кластере. Лидер в кластере может быть только один
docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION uzypzuxnb5bwte8y34crmsm7n * c-stream-9-vm4 Ready Active Leader 25.0.3
Как я и сказал кластер будет с одним хостом, который у меня также является менеджером. Когда есть хоть один хост в кластере я могу начинать разворачивать сервисы (контейнеры).
Создание сервиса с одной репликой
В Docker Swarm сервис (service) — это основной объект кластера, описывающий что запустить и в каком количестве. По сути это тот же контейнер, но только не один, а группа контейнеров, управляемая Docker Swarm.
Для примера я создам сервис web с образа nginx, команда создания будет очень напоминать команду создания контейнера.
docker service create --name web -p 80:80 nginx
После выполнения команды проверяю что сервис создался и контейнер запущен.
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lebyjs6me1wq web replicated 1/1 nginx:latest *:80->80/tcp
Важная колонка в выводе выше это REPLICAS, которая у меня равно 1/1. Как я писал выше сервис — это группа контейнеров и задача Docker Swarm в том, чтобы активных контейнеров было столько сколько требуется, и, если что-то происходит с контейнеров Docker Swarm сам пересоздаёт его чтобы добиться установленного количества запущенных контейнеров. Да пример с одним контейнером может и не очень вписывается, но сейчас про базовый минимум, дальше больше.
Команда docker service ls выводит только сервисы, но не контейнеры чтобы просмотреть контейнеры используется docker service ps servicename.
docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
po9wm3t0jopd web.1 nginx:latest c-stream-9-vm4 Running Running 21 minutes ago
🔍 Разбор колонок
| Колонка | Значение |
|---|---|
| ID | Уникальный идентификатор task внутри Swarm. Это не ID контейнера, а объект уровня оркестрации. Например: po9wm3t0jopd. |
| NAME | Имя задачи в формате <service>.<replica>. Здесь web.1 означает первую реплику сервиса web. Если бы docker service scale web=3, появились бы web.2, web.3. |
| IMAGE | Образ, из которого создаётся контейнер nginx:latest. |
| NODE | Имя узла (нодa), где запущен этот task - c-stream-9-vm4, то есть менеджерская (или воркерская) нода кластера. |
| DESIRED STATE | Желаемое состояние (desired state), которое Swarm хранит в своей Raft-базе. Обычно бывает: • Running — контейнер должен работать; • Shutdown — контейнер должен быть остановлен. |
| CURRENT STATE | Фактическое состояние на данный момент. Например: Running 21 minutes ago, Preparing, Starting, Shutdown, Failed, и т.д. Swarm сам старается привести CURRENT STATE к DESIRED STATE. |
| ERROR | Сообщение об ошибке, если задача не смогла стартовать (например, ошибка сети, образа, volume и т.д.). Если пусто, значит всё хорошо. |
| PORTS | Показывает, какие порты опубликованы (для ingress load balancer). |
Создание сервиса с несколькими репликами
Если необходимо создать новый сервис с несколькими репликами, то используется уже знакомая команда docker service create, только с опцией –replicas
docker service create --replicas 3 --name web -p 80:80 nginx
Но в моём случае сервис уже создан и мне необходимо обновить его конфигурацию используя команду docker service scale.
docker service scale web=3
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lebyjs6me1wq web replicated 3/3 nginx:latest *:80->80/tcp
docker service ps web
ek9stzbp8o5f web.1 nginx:latest c-stream-9-vm4 Running Running 15 minutes ago
mmnfk0ju6zfp web.2 nginx:latest c-stream-9-vm4 Running Running 10 seconds ago
2vya3bqgkmn0 web.3 nginx:latest c-stream-9-vm4 Running Running 10 seconds ago
Из вывода видно, что помимо существующего web.1 создались еще два контейнера web.2 и web.3, благодаря чему достигнут необходимый минимум 3/3.
Также можно воспользоваться другой командой docker service update web --replicas 4.
Также выполняя команду docker service scale можно уменьшить количество контейнеров.
Что если удалить контейнер сервиса Docker Swarm
Я рассмотрел, что будет если увеличить количество контейнеров в сервисе, но что произойдёт если удалить контейнер в обход Docker Swarm? Ответ простой: Docker Swarm просто его пересоздаст чтобы выполнить требуемые REPLICAS.
docker ps
docker container rm -f web.2.mmnfk0ju6zfp0ochr6rm474ga
docker service ps web
rf6nnxv6zh03 web.2 nginx:latest c-stream-9-vm4 Running Running 24 seconds ago
mmnfk0ju6zfp \_ web.2 nginx:latest c-stream-9-vm4 Shutdown Failed 30 seconds ago "task: non-zero exit (137)"
Удаление сервиса
Как не трудно догадаться удаление выполняется командой docker service rm.
docker service rm web
docker service ls
docker service ps web
no such service: web


Комментарии