Docker Swarm — это система оркестрации контейнеров, построенная на базе Docker Engine. Она позволяет создавать и развертывать кластер узлов Docker с несколькими серверами. Docker Swarm упрощает развертывание контейнерных приложений в виде сервиса. Обеспечивает простой и удобный способ управления и оркестрации контейнеров.
Docker Swarm обеспечивает высокий уровень доступности приложений. В Docker Swarm вы можете запускать одно приложение или службу на нескольких узлах, которые называются «рабочими узлами». Есть также узел под названием «Swarm Manager», который является центральным управлением и оркестрацией Docker Swarm.
В этом руководстве вы узнаете, как настроить Docker Swarm с помощью серверов Rocky Linux. Вы установите Docker на каждый сервер, настроите firewalld, инициализируете Swarm Manager, добавите узлы и, наконец, узнаете об основных способах использования Docker Swarm для развертывания контейнерных приложений.
Необходимые условия
Для выполнения этого руководства вам понадобятся как минимум три сервера Rocky Linux и пользователь без прав root с правами sudo/администратора.
Для этой демонстрации мы будем использовать три сервера Rocky Linux со следующими характеристиками:
Hostname IP Address Used as --------------------------------------------------- swarm-manager1 192.168.5.100 Swarm Manager worker1 192.168.5.120 Node worker2 192.168.5.121 Node
После выполнения всех этих требований вы готовы приступить к развертыванию Docker Swarm.
Установка Docker
Чтобы настроить Docker Swarm, необходимо установить Docker Engine на каждой машине/сервере. Для дистрибутива Rocky Linux вы можете установить Docker через официальный репозиторий Docker.
Теперь вы установите Docker Engine на каждый из ваших серверов Rocky Linux.
Добавьте репозиторий Docker для системы Rocky Linux с помощью команды dnf, приведенной ниже.
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
После добавления репозитория запустите приведенную ниже команду dnf, чтобы проверить список репозиториев и обновить все пакеты.
sudo dnf repo list sudo dnf update
Если репозиторий Docker добавлен, вы увидите следующий вывод:

Затем установите Docker с помощью команды dnf, приведенной ниже. Когда появится запрос на подтверждение установки, введите y и нажмите ENTER чтобы продолжить.
sudo dnf install docker-ce docker-ce-cli containerd.io

После установки Docker запустите и включите службу ‘docker‘ с помощью команды systemctl, приведенной ниже. Служба ‘docker‘ должна работать и будет автоматически запускаться при загрузке системы.
sudo systemctl enable docker sudo systemctl start docker
Наконец, проверьте работу службы ‘docker‘ с помощью приведенной ниже команды, чтобы убедиться, что служба работает.
sudo systemctl status docker
Если служба «docker» запущена, вы должны получить результат, как показано ниже.

Кроме того, если вы хотите запустить Docker с пользователем, не являющимся root, вы должны добавить пользователя в группу ‘docker‘ с помощью приведенной ниже команды.
sudo usermod -aG docker user
Настройка Firewalld
Для производственной среды необходимо включить брандмауэр на каждом сервере. В системе Rocky Linux по умолчанию брандмауэр firewalld включен. Поэтому вам нужно только добавить несколько портов TCP и UDP для развертывания Docker Swarm.
Ниже приведены некоторые порты TCP и UDP, которые необходимо открыть на каждом сервере для развертывания Docker Swarm и обеспечения его правильной работы:
- TCP-порт 2377 для связи по управлению кластером — это необходимо, если у вас есть несколько Swarm Managers.
- TCP- и UDP-порт 7946 для связи между узлами — для всех узлов в среде Swarm.
- UDP-порт 4789 для трафика наложенной сети
Добавьте порты Docker Swarm в firewalld с помощью команды firewall-cmd, приведенной ниже.
sudo firewall-cmd --add-port=2377/tcp --permanent sudo firewall-cmd --add-port=7946/tcp --permanent sudo firewall-cmd --add-port=7946/udp --permanent sudo firewall-cmd --add-port=4789/udp --permanent
Затем перезагрузите правила firewalld и проверьте список портов в firewalld с помощью команды, приведенной ниже.
sudo firewall-cmd --reload sudo firewall-cmd --list-port
Вы должны увидеть, что некоторые порты TCP и UDP для развертывания Docker Swarm добавлены в firewalld.

После установки движка Docker на каждом сервере и настройки Firewalld вы можете настроить развертывание Docker Swarm, инициализировав первый узел в качестве «менеджера Swarm».
Инициализация Swarm Manager
Swarm Manager — это мозг вашей среды Docker Swarm. Для крупных развертываний вы можете добавить несколько серверов в качестве Swarm Manager, что обеспечит высокую доступность и отказоустойчивость вашего Swarm Manager.
Swarm Manager — это менеджер кластера для Docker Swarm, он управляет состоянием развертываний ваших приложений и интегрирован с Docker Engine. Swarm Manager предоставляет декларативную модель обслуживания и масштабирование обслуживания, желаемое состояние обслуживания, а также обеспечивает последовательные обновления.
В этом примере мы инициализируем сервер «swarm-manager1» с IP-адресом «192.168.5.100» в качестве Swarm Manager.
Запустите следующую команду «docker swarm init» на сервере «swarm-manager1», чтобы начать инициализацию Swarm Manager в вашей среде развертывания.
В этом примере Swarm Manager работает по IP-адресу «192.168.5.100», а сетью по умолчанию для служб в Docker Swarm будет «10.10.0.0/16».
docker swarm init --advertise-addr 192.168.5.100 --default-addr-pool 10.10.0.0/16
Теперь, когда Swarm Manager инициализирован, вы должны увидеть вывод, похожий на следующий скриншот. Кроме того, вы можете увидеть инструкцию о том, что вам необходимо добавить рабочие узлы в развертывание Docker Swarm, включая сгенерированный токен, который вы должны использовать.

Затем выполните следующую команду docker, чтобы убедиться, что режим Swarm активирован и включен.
docker info
Вы увидите, что режим Swarm является «активным», а сетевой IP-адрес для служб — «10.10.0.0/16», что соответствует конфигурации во время процесса инициализации. Кроме того, вы можете увидеть, что в настоящее время в Docker Swarm доступен только один узел «1».

Проверьте список доступных узлов в Docker Swarm с помощью команды «docker node» ниже. Вы увидите, что в развертывании Docker Swarm есть только один узел.
docker node ls

Добавление рабочих узлов в Swarm
В Docker Swarm рабочий узел имеет ту же концепцию, что и в других системах оркестрации контейнеров, где контейнеры выполняются и работают. Docker Engine должен быть установлен на каждом рабочем узле, а также рабочий узел может быть повышен до «Swarm Manager».
В то же время Swarm Manager также может использоваться в качестве рабочего узла, что означает, что ваше приложение также может работать на Swarm Manager.
Запустите следующую команду:docker swarm join», чтобы добавить серверы «worker1» и «worker2» к Docker Swarm. Также не забудьте заменить токен на сгенерированный токен в вашей среде.
docker swarm join \ --token SWMTKN-1-4qxedy87gygenejrw06hlqpuwfm6erulccfj1jhnmsn0kehbnb-2ld4g3zo36bzu8d8ss4115rhq 192.168.5.100:2377
Когда вы получите сообщение вывода, например «Этот узел присоединился к рою в качестве рабочего», это означает, что рабочий узел добавлен.
Вы можете увидеть аналогичный вывод, когда «worker1» и «worker2» присоединяются к Docker Swarm.

Затем снова перейдите в Swarm Manager и выполните приведенную ниже команду docker, чтобы проверить список узлов в вашем Docker Swarm.
docker node ls
Вы должны увидеть три узла в вашей среде Docker Swarm. В этом примере ‘swarm-manager1» используется в качестве Swarm Manager, а оба сервера «worker1» и «worker2» используются в качестве рабочих узлов.

Кроме того, вы также можете проверить список узлов с помощью приведенной ниже команды docker.
docker info
На сервере Swarm Manager вы можете увидеть вывод на следующем скриншоте. Имеется 1 менеджер и 3 узла (swarm-manager также используется в качестве рабочего узла).

Но на серверах «worker1» и «worker2» вы увидите следующий вывод. Вы можете увидеть IP-адрес Swarm Manager с портом TCP по умолчанию 2377.

На этом вы завершили развертывание Docker Swarm с использованием Rocky Linux. Далее вы развернете приложение/службу в своей среде Swarm.
Управление службами в Docker Swarm
Когда вы развертываете приложение в среде Docker Swarm, это приложение будет называться «службой». Это образ вашего микросервисного приложения, и это может быть HTTP-сервер, сервер базы данных или другие приложения.
Чтобы развернуть службу в Docker Swarm, необходимо указать базовый образ, который будет использоваться, порты, конкретное имя службы, а также количество реплик для службы.
Теперь вы узнаете об основных принципах развертывания служб в Docker Swarm.
В этом примере вы создадите новый сервис «test-httpd» с 1 репликой и откроете порт «8000» на узле Swarm. Изображение, которое вы будете использовать, — «httpd:alpine».
Запустите следующую команду «docker service», чтобы создать новую службу.
docker service create --replicas 1 --name test-httpd -p 8000:80 httpd:alpine

Теперь проверьте службы в Docker Swarm с помощью приведенной ниже команды docker. Вы должны увидеть, что служба «test-httpd» работает и также открывает TCP-порт 8000 с только одной копией.
docker service ls

Затем проверьте подробные сведения о службе «test-httpd» с помощью приведенной ниже команды.
docker service inspect test-httpd docker service inspect --pretty test-httpd
Ниже вы можете увидеть подробную информацию о службе «test-httpd».

Кроме того, вы можете проверить контейнер, который работает на службе «test-httpd», с помощью команды «docker service», как показано ниже.
docker service ps test-httpd
Вы можете увидеть, что контейнер «test-httpd.1» работает на сервере «swarm-manager1».

Теперь откройте порт «8000» на всех серверах с помощью следующей команды firewall-cmd.
sudo firewall-cmd --add-port=8000/tcp
После этого проверьте службу «test-httpd» с помощью команды curl, как показано ниже. В этом примере «swarm-manager1» IP-адрес «192.168.5.100».
curl 192.168.5.30:8000 curl -I 192.168.5.30:8000
Вы увидите стандартную страницу index.html службы «test-httpd».

Масштабирование служб в Docker Swarm
После развертывания службы на Docker Swarm вы узнаете, как масштабировать службы и приложения.
Выполните следующую команду, чтобы масштабировать службу «test-httpd» до 3 реплик. Эта команда создаст еще две службы «test-httpd» на рабочих узлах.
docker service scale test-httpd=3

Теперь проверьте список запущенных служб с помощью следующей команды. Вы должны увидеть, что еще одна служба «test-httpd» запущена на серверах «worker1» и «worker2».
docker service ps test-httpd

Наконец, проверьте службу с помощью команды curl, как показано ниже, на обоих серверах «worker1» и «worker2». Если служба запущена, вы должны увидеть на экране стандартную страницу index.html.
Проверка службы на worker1.
docker ps curl worker1:8000

Проверка службы на worker2.
docker ps curl worker2:8000

Удаление служб в Docker Swarm
Вы изучили основные принципы развертывания и масштабирования служб в Docker Swarm. Далее вы очистите среду Docker Swarm, удалив службу «test-httpd».
Выполните следующую команду, чтобы удалить службу «test-httpd» из Docker Swarm.
docker service rm test-httpd
После этого проверьте службу «test-httpd» с помощью команды «docker service inspect», приведенной ниже. Вы должны увидеть, что служба удалена.
docker service inspect test-httpd
Кроме того, вы также можете проверить с помощью команды docker ниже, чтобы проверить список запущенных контейнеров и образов в вашем Swarm.
Вы должны увидеть, что контейнер удален, а образ httpd:alpine доступен на всех серверах.
docker ps docker images
Заключение
В этом руководстве вы развернули Docker Swarm с тремя серверами Rocky Linux. Вы также узнали, как установить Docker Engine на сервере Linux и настроить Firewalld в системе Rocky Linux. И, наконец, вы также узнали, как развернуть базовое приложение в Docker Swarm с помощью команды «docker service».
Теперь вы можете развертывать свои контейнерные приложения со всеми зависимостями в Docker Swarm. Вы также можете добавить дополнительные Swarm Manager, чтобы настроить высокую доступность вашей среды Docker Swarm.