Основы 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:
docker swarm init --advertise-addr <IP-адрес_или_интерфейс_менеджера>--advertise-addr указывает IP-адрес или сетевой интерфейс, который другие узлы будут использовать для связи с менеджером.
После успешной инициализации менеджер выведет команду, которую необходимо выполнить на рабочих узлах для присоединения к swarm-кластеру. Эта команда будет содержать токен.
Присоединение узлов к Swarm-кластеру
Присоединение рабочего узла
На рабочем узле выполните команду, полученную от менеджера (она будет выглядеть примерно так):
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy <IP-адрес_или_хост_менеджера>:2377Присоединение менеджера (для обеспечения отказоустойчивости)
Чтобы добавить еще один менеджер в swarm-кластер (рекомендуется для отказоустойчивости), выполните на другом Docker-хосте команду, полученную от первого менеджера (она будет выглядеть примерно так):
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz --manager-advertise-addr <IP-адрес_или_интерфейс_нового_менеджера>:2377 <IP-адрес_или_хост_существующего_менеджера>:2377--manager-advertise-addr указывает IP-адрес или интерфейс нового менеджера для связи с другими менеджерами.
Управление узлами Swarm-кластера
Вы можете управлять узлами swarm-кластера с менеджера с помощью команды docker node.
Просмотр списка узлов
docker node lsЭта команда выведет список всех узлов в кластере, их ID, статус, доступность, роль (manager или worker) и версию Docker Engine.
Информация об узле
Чтобы получить подробную информацию о конкретном узле, используйте команду docker node inspect:
docker node inspect <ID_или_имя_узла>Обновление узла
Вы можете обновлять свойства узла, такие как его роль или доступность:
docker node update --role worker <ID_или_имя_узла> # Изменить роль на worker
docker node update --availability drain <ID_или_имя_узла> # Перевести узел в состояние drain (не назначать новые задачи)
docker node update --availability active <ID_или_имя_узла> # Вернуть узел в активное состояниеУдаление узла из кластера
Чтобы удалить узел из swarm-кластера:
docker node rm <ID_или_имя_узла> # Удаление с менеджера (рабочий узел должен покинуть кластер командой docker swarm leave)
docker node rm --force <ID_или_имя_узла> # Принудительное удаление (если узел недоступен)На рабочем узле для выхода из кластера используется команда docker swarm leave:
docker swarm leaveНа менеджере для принудительного выхода (если узел недоступен):
docker swarm leave --forceРазвертывание сервисов в Swarm-кластере
Для развертывания приложений в swarm-кластере используются сервисы. Сервисы определяют, какие контейнеры запускать и как они должны работать. Сервисы управляются менеджерами.
Создание сервиса
Сервисы создаются с помощью команды docker service create:
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, который будет использоваться для контейнеров сервиса.
Просмотр списка сервисов
docker service lsЭта команда выведет список всех запущенных сервисов, их ID, имена, количество реплик, образ и порты.
Информация о сервисе
Чтобы получить подробную информацию о конкретном сервисе, используйте команду docker service inspect:
docker service inspect <ID_или_имя_сервиса>Масштабирование сервиса
Вы можете изменять количество реплик сервиса для масштабирования приложения:
docker service scale my-web=5Эта команда увеличит количество реплик сервиса my-web до 5. Swarm автоматически запустит дополнительные контейнеры на доступных рабочих узлах.
Обновление сервиса
Вы можете обновлять различные параметры сервиса, такие как образ, порты, переменные окружения и количество реплик:
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:
docker service ps my-webЭта команда покажет ID задачи, имя сервиса, желаемое и текущее состояние, ошибки (если есть) и узел, на котором выполняется задача.
Удаление сервиса
Чтобы удалить сервис и все его задачи, используйте команду docker service rm:
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:
docker stack deploy --compose-file docker-compose.yml my-stackmy-stack — это имя развертывания (stack). Docker Compose преобразует определения сервисов из файла docker-compose.yml в сервисы Swarm.
Управление развернутыми стеками осуществляется с помощью команды docker stack.
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.