JavaRush /Курсы /Модуль 2: Fullstack /Введение в Docker Swarm

Введение в Docker Swarm

Модуль 2: Fullstack
15 уровень , 5 лекция
Открыта

6.1 Основные концепции Docker Swarm

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

Основные концепции Docker Swarm:

  1. Кластер (Swarm): группа Docker-хостов, объединенных в единый логический кластер.
  2. Менеджеры (Managers): узлы, управляющие кластером и распределяющие задачи между рабочими узлами.
  3. Рабочие узлы (Workers): узлы, которые выполняют задачи и запускают контейнеры.
  4. Сервисы (Services): логическое представление приложений, описывающее, какие задачи нужно выполнять и сколько экземпляров контейнеров запустить.
  5. Задачи (Tasks): единичные контейнеры, являющиеся экземплярами сервисов.

Архитектура Docker Swarm:

Docker Swarm использует архитектуру на основе менеджеров и рабочих узлов. Менеджеры управляют состоянием кластера, а рабочие узлы выполняют задачи.

Менеджеры:

  • Управляют состоянием кластера и его конфигурацией.
  • Распределяют задачи между рабочими узлами.
  • Обеспечивают отказоустойчивость и высокую доступность (при наличии нескольких менеджеров).

Рабочие узлы:

  • Выполняют задачи, назначенные менеджерами.
  • Запускают контейнеры в соответствии с заданиями.

Основные команды Docker Swarm:

  1. docker swarm init: инициализация нового кластера Swarm.
  2. docker swarm join: присоединение узла к существующему кластеру.
  3. docker node ls: просмотр списка узлов в кластере.
  4. docker service create: создание нового сервиса.
  5. docker service ls: просмотр запущенных сервисов.
  6. docker service scale: масштабирование сервиса до определенного количества экземпляров.
  7. docker service rm: удаление сервиса из кластера.

Использование Docker Swarm позволяет упростить управление приложениями в распределенных системах, обеспечивая отказоустойчивость, масштабируемость и удобство развертывания.

6.2 Создание кластера Docker Swarm

Создание и управление кластером Docker Swarm

Шаг 1: Инициализация кластера

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

Terminal

docker swarm init --advertise-addr <MANAGER_IPl>

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

Шаг 2: Присоединение рабочих узлов

На других хостах выполните команду, выведенную при выполнении docker swarm init, чтобы присоединить их к кластеру:

Terminal

docker swarm join --token <SWARM_TOKEN> <MANAGER_IP>:2377

Где:

  • <SWARM_TOKEN>: токен для подключения к кластеру (выдается командой docker swarm init).
  • <MANAGER_IP>: IP-адрес узла-менеджера.

Шаг 3: Просмотр узлов

Для просмотра всех узлов в кластере используйте команду:

Terminal

docker node ls

Эта команда покажет список всех узлов, включая их роли, состояния и доступность.

Пример вывода команды docker node ls

Terminal

ID                 HOSTNAME            STATUS              AVAILABILITY       MANAGER STATUS
qwertyuiop12345    manager-node        Ready               Active             Leader
asdfghjkl67890      worker-node1       Ready               Active
zxcvbnm09876       worker-node2       Ready               Active

Объяснение колонок:

  • ID: Уникальный идентификатор узла.
  • HOSTNAME: Имя хоста, на котором запущен узел.
  • STATUS: Текущий статус узла (например, Ready).
  • AVAILABILITY: Доступность узла (например, Active).
  • MANAGER STATUS: Показывает, является ли узел менеджером (например, Leader, Reachable) или рабочим узлом (пусто).

Теперь кластер Docker Swarm настроен, и вы можете создавать и масштабировать приложения.

6.3 Управление Docker Swarm

Управление сервисами в Docker Swarm

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

Создайте сервис, который будет запущен с заданным количеством реплик:

Terminal

docker service create --name my_web --replicas 3 -p 8080:80 nginx

В этом примере создается сервис my_web, который запускает 3 экземпляра Nginx. Контейнеры публикуют порт 80 на порт 8080 хоста.

2. Просмотр сервисов

Для просмотра всех запущенных сервисов в кластере используйте команду:

Terminal

docker service ls

Пример вывода команды docker service ls

Terminal

ID                     NAME         MODE           REPLICAS     IMAGE
ab12345               my_web       replicated     3/3          nginx:latest

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

Для изменения количества экземпляров (реплик) сервиса используйте команду docker service scale:

Terminal

docker service scale my_web=5

Теперь сервис my_web будет иметь 5 экземпляров.

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

Для обновления образа сервиса на новую версию используйте команду docker service update:

Terminal

docker service update --image nginx:latest my_web

Обеспечение высокой доступности

Docker Swarm поддерживает высокую доступность за счет:

  1. Распределения задач между узлами в кластере для автоматического восстановления контейнеров при сбоях.
  2. Поддержки нескольких менеджеров: Рекомендуется нечетное количество менеджеров (например, 3 или 5) для избежания проблем с кворумом.
  3. Использования реплик: Настройте несколько реплик для каждого сервиса, чтобы повысить отказоустойчивость.

Понятие кворума

Кворум представляет собой большинство узлов, которые должны согласиться с определенным действием (например, записью данных или выбором лидера), чтобы оно считалось действительным. Например, в кластере из 5 узлов кворумом будет 3 узла.

Полезный совет! Убедитесь, что менеджеры размещены на разных физических или облачных серверах, чтобы минимизировать риск одновременных сбоев.

6.4 Пример конфигурации Docker Compose для Docker Swarm

Docker Compose можно использовать с Docker Swarm для упрощения управления многоконтейнерными приложениями.

Пример файла docker-compose.yml

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080-8090:80"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    networks:
      - my_overlay_network

  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: example
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    networks:
      - my_overlay_network

networks:
  my_overlay_network:
    driver: overlay
    

Запуск стека Docker Compose в Swarm

Для развертывания стека в Docker Swarm используйте команду:

Terminal

docker stack deploy -c docker-compose.yml mystack

Просмотр стека

Просмотр развернутых стеков:

Terminal

docker stack ls

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

Terminal

docker stack services mystack
3
Задача
Модуль 2: Fullstack, 15 уровень, 5 лекция
Недоступна
Инициализация кластера Swarm
Инициализация кластера Swarm
3
Задача
Модуль 2: Fullstack, 15 уровень, 5 лекция
Недоступна
Присоединение рабочих узлов к Swarm
Присоединение рабочих узлов к Swarm
3
Задача
Модуль 2: Fullstack, 15 уровень, 5 лекция
Недоступна
Создание и масштабирование сервиса
Создание и масштабирование сервиса
3
Задача
Модуль 2: Fullstack, 15 уровень, 5 лекция
Недоступна
Обновление сервиса в Swarm
Обновление сервиса в Swarm
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Константин Contact Уровень 20
25 апреля 2025
Что за порт 2377 во второй задаче, если "Рабочий узел должен иметь IP-адрес 192.168.1.20"? 🤨
Slevin Уровень 64
9 октября 2025
Это бред ИИ писавшего условия, ибо IP-адрес мы не устанавливаем, мы просто подключаем узел
Nataly Уровень 47
20 февраля 2025
В примере Шаг 2 пропущена буква в строке MANAGER_IP: docker swarm join --token <SWARM_TOKEN> <ANAGER_IP>:2377
Константин Contact Уровень 20
25 апреля 2025
А в следующем шаге в окне Terminal заголовки поехали ID HOSTNAME STATUS AVAILABILITY