Skip to content

Основы Docker: Docker Swarm

Docker Swarm — это собственное решение Docker для кластеризации и оркестрации контейнеров. Оно позволяет управлять группой Docker-хостов (называемых узлами) как единой виртуальной системой. Swarm предоставляет такие возможности, как масштабирование, обнаружение сервисов, балансировка нагрузки и отказоустойчивость для контейнеризованных приложений.

Основные понятия Docker Swarm

  • Узел (Node): Экземпляр Docker-движка, участвующий в swarm-кластере. Узлы могут быть менеджерами или рабочими.
  • Менеджер (Manager Node): Узел, отвечающий за управление swarm-кластером, оркестрацию сервисов, распределение задач между рабочими узлами и поддержание желаемого состояния кластера. Рекомендуется иметь несколько менеджеров для обеспечения отказоустойчивости.
  • Рабочий (Worker Node): Узел, выполняющий контейнеры (задачи), назначенные менеджерами.
  • Сервис (Service): Определение задачи, которую необходимо выполнить в swarm. Сервис описывает, какой образ контейнера использовать, сколько реплик (экземпляров) запустить, какие сети и тома использовать и т.д.
  • Задача (Task): Конкретный экземпляр контейнера, выполняющийся в рамках сервиса. Менеджер распределяет задачи между рабочими узлами.
  • Оркестрация (Orchestration): Автоматическое управление жизненным циклом контейнеров и сервисов для поддержания желаемого состояния приложения.
  • Обнаружение сервисов (Service Discovery): Автоматическое обнаружение сетевых адресов сервисов внутри swarm-кластера.
  • Балансировка нагрузки (Load Balancing): Распределение входящего трафика между репликами сервиса.

Инициализация Swarm-кластера

Первым шагом является инициализация swarm-кластера на одном из ваших Docker-хостов (который станет менеджером). Используйте команду docker swarm init:

bash
docker swarm init --advertise-addr <IP-адрес_или_интерфейс_менеджера>

--advertise-addr указывает IP-адрес или сетевой интерфейс, который другие узлы будут использовать для связи с менеджером.

После успешной инициализации менеджер выведет команду, которую необходимо выполнить на рабочих узлах для присоединения к swarm-кластеру. Эта команда будет содержать токен.

Присоединение узлов к Swarm-кластеру

Присоединение рабочего узла

На рабочем узле выполните команду, полученную от менеджера (она будет выглядеть примерно так):

bash
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy <IP-адрес_или_хост_менеджера>:2377

Присоединение менеджера (для обеспечения отказоустойчивости)

Чтобы добавить еще один менеджер в swarm-кластер (рекомендуется для отказоустойчивости), выполните на другом Docker-хосте команду, полученную от первого менеджера (она будет выглядеть примерно так):

bash
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz --manager-advertise-addr <IP-адрес_или_интерфейс_нового_менеджера>:2377 <IP-адрес_или_хост_существующего_менеджера>:2377

--manager-advertise-addr указывает IP-адрес или интерфейс нового менеджера для связи с другими менеджерами.

Управление узлами Swarm-кластера

Вы можете управлять узлами swarm-кластера с менеджера с помощью команды docker node.

Просмотр списка узлов

bash
docker node ls

Эта команда выведет список всех узлов в кластере, их ID, статус, доступность, роль (manager или worker) и версию Docker Engine.

Информация об узле

Чтобы получить подробную информацию о конкретном узле, используйте команду docker node inspect:

bash
docker node inspect <ID_или_имя_узла>

Обновление узла

Вы можете обновлять свойства узла, такие как его роль или доступность:

bash
docker node update --role worker <ID_или_имя_узла> # Изменить роль на worker
docker node update --availability drain <ID_или_имя_узла> # Перевести узел в состояние drain (не назначать новые задачи)
docker node update --availability active <ID_или_имя_узла> # Вернуть узел в активное состояние

Удаление узла из кластера

Чтобы удалить узел из swarm-кластера:

bash
docker node rm <ID_или_имя_узла> # Удаление с менеджера (рабочий узел должен покинуть кластер командой docker swarm leave)
docker node rm --force <ID_или_имя_узла> # Принудительное удаление (если узел недоступен)

На рабочем узле для выхода из кластера используется команда docker swarm leave:

bash
docker swarm leave

На менеджере для принудительного выхода (если узел недоступен):

bash
docker swarm leave --force

Развертывание сервисов в Swarm-кластере

Для развертывания приложений в swarm-кластере используются сервисы. Сервисы определяют, какие контейнеры запускать и как они должны работать. Сервисы управляются менеджерами.

Создание сервиса

Сервисы создаются с помощью команды docker service create:

bash
docker service create --name my-web --publish 80:80 --replicas 3 nginx:latest
  • --name my-web: Имя сервиса.
  • --publish 80:80: Публикация порта 80 контейнера на порт 80 любого узла в кластере (Swarm автоматически маршрутизирует трафик).
  • --replicas 3: Желаемое количество реплик (экземпляров) контейнера. Swarm будет поддерживать это количество, автоматически перезапуская отказавшие контейнеры и распределяя их по доступным рабочим узлам.
  • nginx:latest: Образ Docker, который будет использоваться для контейнеров сервиса.

Просмотр списка сервисов

bash
docker service ls

Эта команда выведет список всех запущенных сервисов, их ID, имена, количество реплик, образ и порты.

Информация о сервисе

Чтобы получить подробную информацию о конкретном сервисе, используйте команду docker service inspect:

bash
docker service inspect <ID_или_имя_сервиса>

Масштабирование сервиса

Вы можете изменять количество реплик сервиса для масштабирования приложения:

bash
docker service scale my-web=5

Эта команда увеличит количество реплик сервиса my-web до 5. Swarm автоматически запустит дополнительные контейнеры на доступных рабочих узлах.

Обновление сервиса

Вы можете обновлять различные параметры сервиса, такие как образ, порты, переменные окружения и количество реплик:

bash
docker service update --image nginx:1.21 my-web # Обновление образа
docker service update --publish 8080:80 my-web # Изменение опубликованного порта
docker service update --env-add NEW_VAR=value my-web # Добавление переменной окружения

Обновления сервисов выполняются постепенно (rolling updates) по умолчанию, чтобы обеспечить непрерывную доступность приложения.

Просмотр задач сервиса

Чтобы увидеть список задач (контейнеров), выполняющихся в рамках сервиса, используйте команду docker service ps:

bash
docker service ps my-web

Эта команда покажет ID задачи, имя сервиса, желаемое и текущее состояние, ошибки (если есть) и узел, на котором выполняется задача.

Удаление сервиса

Чтобы удалить сервис и все его задачи, используйте команду docker service rm:

bash
docker service rm my-web

Сети и тома в Swarm-кластере

Сети

В Docker Swarm используются overlay networks для обеспечения взаимодействия между сервисами, работающими на разных узлах кластера. Вы можете создавать overlay-сети с помощью команды docker network create -d overlay <имя_сети>. Контейнеры сервисов, подключенные к одной overlay-сети, могут взаимодействовать друг с другом по именам сервисов (DNS-разрешение имен).

Тома

Для хранения постоянных данных в Swarm используются managed volumes. Вы можете создавать тома, которые будут доступны для сервисов в кластере. Docker Swarm обеспечивает согласованность данных при использовании томов. Тома создаются с помощью команды docker volume create --driver local <имя_тома> (по умолчанию локальные тома) или с использованием сторонних драйверов томов, поддерживающих кластеризацию.

При определении сервисов вы можете монтировать тома в контейнеры.

Docker Compose и Swarm

Вы также можете использовать файлы docker-compose.yml для определения сервисов и развертывания их в Swarm-кластере с помощью команды docker stack deploy:

bash
docker stack deploy --compose-file docker-compose.yml my-stack

my-stack — это имя развертывания (stack). Docker Compose преобразует определения сервисов из файла docker-compose.yml в сервисы Swarm.

Управление развернутыми стеками осуществляется с помощью команды docker stack.

bash
docker stack ls        # Просмотр списка развертываний
docker stack ps my-stack # Просмотр задач стека
docker stack rm my-stack # Удаление развертывания

Преимущества Docker Swarm

  • Простота использования: Легко настроить и управлять кластером с помощью Docker CLI.
  • Масштабируемость: Легко масштабировать приложения, увеличивая или уменьшая количество реплик сервисов.
  • Отказоустойчивость: Swarm автоматически поддерживает желаемое количество реплик и перераспределяет задачи при отказе узлов.
  • Обнаружение сервисов и балансировка нагрузки: Встроенные механизмы для обнаружения сервисов и распределения трафика.
  • Интеграция с Docker: Полностью интегрирован с Docker Engine и Docker CLI.

Docker Swarm является мощным инструментом для оркестрации контейнеров, особенно для небольших и средних кластеров, где простота настройки и использования являются приоритетом. Для более сложных сценариев оркестрации с расширенными возможностями может потребоваться использование более продвинутых инструментов, таких как Kubernetes.