Как использовать команду docker stack deploy для управления службами Swarm

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь эффективно управлять службами Docker Swarm с помощью команды docker stack deploy. Мы начнем с подготовки простого файла docker-compose.yml, который служит чертежом для нашего стека приложений.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/system("Manage Docker") subgraph Lab Skills docker/ls -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} docker/ps -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} docker/rm -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} docker/inspect -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} docker/pull -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} docker/system -.-> lab-555234{{"Как использовать команду docker stack deploy для управления службами Swarm"}} end

Подготовка простого файла docker-compose для развертывания в Swarm

На этом этапе мы подготовим простой файл docker-compose.yml, который будем использовать для развертывания стека в кластере Docker Swarm. Прежде чем использовать docker-compose, нам нужно его установить.

Сначала установим docker-compose. Мы скачаем бинарный файл и сделаем его исполняемым.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Эта команда скачивает бинарный файл docker-compose с официальной страницы релизов на GitHub и сохраняет его в /usr/local/bin/docker-compose. Части $(uname -s) и $(uname -m) автоматически определяют вашу операционную систему и архитектуру. Команда chmod +x делает скачанный файл исполняемым.

Теперь проверим установку, проверив версию.

docker-compose --version

В консоли должно отобразиться установленная версия docker-compose.

Далее мы создадим простой файл docker-compose.yml в директории ~/project. Этот файл определит одну службу с использованием образа nginx.

nano ~/project/docker-compose.yml

Вставьте следующее содержимое в редактор nano:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Разберем этот файл docker-compose.yml:

  • version: '3.8' указывает версию формата файла Compose. Версия 3.8 подходит для развертывания в Swarm.
  • services: определяет службы, составляющие ваше приложение.
  • web: - это имя нашей службы. Вы можете выбрать любое удобное для вас имя.
  • image: nginx:latest указывает Docker-образ, который будет использоваться для этой службы. Мы используем последнюю версию официального образа nginx.
  • ports: сопоставляет порты между хостом и контейнером. "80:80" сопоставляет порт 80 на хосте с портом 80 в контейнере.

Сохраните файл, нажав Ctrl + X, затем Y, а затем Enter.

Прежде чем развернуть эту службу, убедимся, что образ nginx:latest доступен локально. Мы можем скачать образ с помощью команды docker pull.

docker pull nginx:latest

Эта команда скачивает образ nginx:latest с Docker Hub на вашу локальную машину.

Теперь у вас есть простой файл docker-compose.yml, готовый к развертыванию, и необходимый образ скачан.

Развертывание стека в кластере Swarm с использованием файла компоновки

На этом этапе мы развернем стек, определенный в нашем файле docker-compose.yml, в кластер Docker Swarm. Прежде чем развернуть стек, нам нужно инициализировать кластер Docker Swarm.

Сначала инициализируем кластер Swarm. Поскольку мы используем одну виртуальную машину, инициализируем его как одноузловой кластер Swarm.

docker swarm init

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

Теперь, когда кластер Swarm инициализирован, мы можем развернуть наш стек с помощью команды docker stack deploy. Мы дадим нашему стеку имя, например, mywebstack.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Разберем эту команду:

  • docker stack deploy - это команда, используемая для развертывания стека в кластер Swarm.
  • -c ~/project/docker-compose.yml указывает файл компоновки, который будет использоваться для развертывания. Мы используем файл, который создали на предыдущем этапе.
  • mywebstack - это имя, которое мы даем нашему стеку. Это имя будет использоваться для идентификации служб и контейнеров, принадлежащих этому стеку в рамках кластера Swarm.

После выполнения этой команды Docker Swarm создаст службы, определенные в файле docker-compose.yml. Вы должны увидеть вывод, указывающий, что службы создаются или обновляются.

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

docker stack ls

Эта команда покажет вам список всех развернутых стеков в вашем кластере Swarm. Вы должны увидеть mywebstack в списке.

Мы также можем вывести список служб, запущенных в рамках нашего стека.

docker stack services mywebstack

Эта команда покажет вам службы, связанные со стеком mywebstack. Вы должны увидеть службу mywebstack_web в списке, а также информацию о ее репликах и образе.

Наконец, проверим статус задач службы.

docker service ps mywebstack_web

Эта команда показывает задачи (запущенные контейнеры) для службы mywebstack_web. Вы должны увидеть хотя бы одну задачу со статусом Running.

Теперь вы успешно инициализировали кластер Docker Swarm и развернули стек с использованием файла docker-compose.yml.

Проверка развернутых служб

На этом этапе мы проверим, что службы, развернутые на предыдущем этапе, работают корректно и доступны. Мы развернули веб-сервер Nginx, который должен прослушивать порт 80.

Сначала используем команду docker service ls, чтобы посмотреть список служб, запущенных в кластере Swarm.

docker service ls

Вы должны увидеть службу mywebstack_web в списке с 1/1 репликами, что означает, что один экземпляр службы запущен.

Далее мы можем использовать curl для доступа к веб-серверу Nginx, запущенному внутри контейнера. Поскольку мы сопоставили порт 80 на хосте с портом 80 в контейнере, мы можем получить доступ к нему через localhost на порту 80.

curl localhost:80

Эта команда отправляет HTTP-запрос на localhost по порту 80. Если сервер Nginx работает корректно, вы должны получить HTML-код стандартной приветственной страницы Nginx в качестве вывода. Это подтверждает, что служба работает и доступна с хост-машины.

Для более детального изучения запущенного контейнера для службы web мы можем использовать команду docker ps.

docker ps

Эта команда выводит список всех запущенных контейнеров. Вы должны увидеть контейнер, запускающий образ nginx, с именем, похожим на mywebstack_web.1.<task_id>. В столбце PORTS должно быть указано 0.0.0.0:80->80/tcp, что подтверждает сопоставление портов.

Мы также можем изучить детали службы с помощью команды docker service inspect.

docker service inspect mywebstack_web

Эта команда предоставляет подробную информацию о службе mywebstack_web, включая ее конфигурацию, задачи и настройки сети. Вы можете прокрутить вывод, чтобы увидеть различные детали о службе.

Проведя эти проверки, мы убедились, что наша развернутая служба Nginx работает как ожидается и доступна.

Обновление стека с помощью измененного файла компоновки

На этом этапе мы изменим наш файл docker-compose.yml для обновления развернутого стека. Мы изменим версию образа Nginx и добавим вторую службу.

Сначала отредактируем файл docker-compose.yml.

nano ~/project/docker-compose.yml

Измените файл, чтобы включить вторую службу, например, службу alpine, и измените версию образа Nginx на 1.21.6. Обновленный файл должен выглядеть следующим образом:

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"
  alpine:
    image: alpine:latest
    command: ["sleep", "infinity"]

Рассмотрим изменения:

  • Мы изменили image для службы web с nginx:latest на nginx:1.21.6.
  • Мы добавили новую службу с именем alpine.
  • Служба alpine использует образ alpine:latest.
  • Команда command: ["sleep", "infinity"] позволяет контейнеру alpine работать неограниченно долго.

Сохраните измененный файл, нажав Ctrl + X, затем Y, а затем Enter.

Перед развертыванием обновленного стека нам нужно скачать новые образы nginx:1.21.6 и alpine:latest.

docker pull nginx:1.21.6
docker pull alpine:latest

Теперь мы можем развернуть обновленный стек, используя ту же команду docker stack deploy и то же имя стека. Docker Swarm обнаружит изменения в файле docker-compose.yml и обновит существующий стек.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm выполнит постепенное обновление для службы web, заменив старый контейнер nginx:latest новым, использующим nginx:1.21.6. Он также создаст новую службу alpine и соответствующий ей контейнер. Вы должны увидеть вывод, указывающий, что службы обновляются или создаются.

Чтобы проверить обновление, выведем список служб в стеке еще раз.

docker stack services mywebstack

Теперь вы должны увидеть как службу mywebstack_web, так и службу mywebstack_alpine в списке. Служба mywebstack_web должна показывать обновленный образ nginx:1.21.6.

Вы успешно обновили развернутый стек, изменив файл docker-compose.yml и повторно развернув его.

Удаление служб, не упомянутых в файле компоновки

На этом этапе мы снова изменим файл docker-compose.yml, на этот раз удалив службу. Когда мы повторно развернем стек, Docker Swarm обнаружит, что служба больше не определена в файле компоновки и удалит ее. Этот процесс иногда называется "очисткой" (pruning) служб.

Сначала отредактируем файл docker-compose.yml, чтобы удалить службу alpine.

nano ~/project/docker-compose.yml

Удалите всю секцию alpine: из файла. Файл должен вернуться в исходное состояние, определяя только службу web:

version: "3.8"
services:
  web:
    image: nginx:1.21.6
    ports:
      - "80:80"

Сохраните измененный файл, нажав Ctrl + X, затем Y, а затем Enter.

Теперь разверните стек снова, используя измененный файл docker-compose.yml.

docker stack deploy -c ~/project/docker-compose.yml mywebstack

Docker Swarm сравнит текущее состояние стека mywebstack с определением в обновленном файле docker-compose.yml. Он заметит, что служба alpine больше не присутствует в файле и удалит соответствующую службу и ее задачи из кластера Swarm. Вы должны увидеть вывод, указывающий, что служба alpine удаляется.

Чтобы убедиться, что служба alpine была удалена, выведите список служб в стеке еще раз.

docker stack services mywebstack

Теперь вы должны увидеть только службу mywebstack_web в списке. Служба mywebstack_alpine должна быть удалена.

Наконец, чтобы очистить среду Swarm, мы можем удалить весь стек.

docker stack rm mywebstack

Эта команда удаляет стек mywebstack, включая все его службы и задачи. Вы должны увидеть вывод, подтверждающий удаление.

Чтобы убедиться, что стек удален, выведите список стеков еще раз.

docker stack ls

Стек mywebstack больше не должен быть в списке.

Вы успешно удалили службу из стека, удалив ее из файла docker-compose.yml и повторно развернув стек, а затем очистили среду, удалив весь стек.

Резюме

В этом практическом занятии мы научились использовать команду docker stack deploy для управления службами Docker Swarm. Мы начали с подготовки простого файла docker-compose.yml, который является стандартным способом определения многослужбных приложений для Docker. Это включало установку docker-compose и создание базового YAML-файла, определяющего одну службу Nginx с маппингом портов.

После подготовки мы развернули этот стек в кластере Docker Swarm с помощью команды docker stack deploy, проверили успешное развертывание службы, а затем практиковали обновление стека путем изменения файла docker-compose.yml и повторного развертывания. Наконец, мы научились удалять (pruning) службы, которые больше не определены в обновленном файле компоновки, чтобы обеспечить чистоту нашей среды Swarm и соответствие ее текущему определению приложения.