Как использовать команду docker stack services для вывода списка служб

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

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

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/ps -.-> lab-555238{{"Как использовать команду docker stack services для вывода списка служб"}} docker/rm -.-> lab-555238{{"Как использовать команду docker stack services для вывода списка служб"}} docker/network -.-> lab-555238{{"Как использовать команду docker stack services для вывода списка служб"}} end

Вывод списка всех служб в стеке

На этом этапе вы научитесь выводить список всех служб, работающих в стеке Docker. Прежде чем мы сможем вывести список служб, нам нужно запустить стек. Поскольку 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 установлен, создадим простой файл docker-compose.yml для определения нашего стека. Мы создадим файл с именем docker-compose.yml в директории ~/project.

nano ~/project/docker-compose.yml

Добавьте следующее содержимое в файл:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: alpine:latest
    command: sleep 3600

Этот файл определяет стек с двумя службами: web, использующей образ nginx, и app, использующей образ alpine. Служба web сопоставляет порт 80 на хосте с портом 80 в контейнере. Служба app просто выполняет команду sleep 3600, чтобы контейнер оставался запущенным.

Сохраните файл и выйдите из редактора (Ctrl+X, Y, Enter в nano).

Теперь развернем стек с помощью команды docker stack deploy. Мы назовем наш стек mystack.

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

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

После развертывания стека вы можете вывести список всех служб в стеке, используя команду docker stack services, за которой следует имя стека.

docker stack services mystack

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

Вы должны увидеть вывод, похожий на следующий:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

В выводе перечислены службы mystack_app и mystack_web, что подтверждает, что они работают в рамках стека mystack.

Фильтрация служб по имени

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

Команда docker stack services поддерживает флаг --filter, который позволяет указать критерии для фильтрации вывода. Чтобы отфильтровать по имени службы, можно использовать фильтр name.

Синтаксис фильтрации по имени: --filter name=<service_name>. Помните, что имена служб в стеке обычно имеют префикс в виде имени стека, за которым следует подчеркивание и имя службы, определенное в файле docker-compose.yml (например, mystack_web).

Отфильтруем службы в нашем стеке mystack, чтобы показать только службу web.

docker stack services mystack --filter name=mystack_web

Эта команда отобразит только строку, соответствующую службе mystack_web.

Вы должны увидеть вывод, похожий на следующий:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Обратите внимание, что показана только информация о службе mystack_web.

Аналогично, можно отфильтровать, чтобы показать только службу app:

docker stack services mystack --filter name=mystack_app

Это отобразит информацию о службе mystack_app:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

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

Фильтрация служб по идентификатору

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

Каждая служба в стеке Docker получает уникальный идентификатор. Эти идентификаторы можно увидеть в первом столбце вывода команды docker stack services.

Для фильтрации по идентификатору службы используйте флаг --filter с фильтром id. Синтаксис: --filter id=<service_id>. Вам нужно предоставить только достаточный префикс идентификатора, чтобы однозначно идентифицировать службу.

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

docker stack services mystack

Посмотрите на вывод и определите идентификаторы для служб mystack_web и mystack_app. Идентификаторы будут представлены строкой шестнадцатеричных символов. Например, вывод может выглядеть так (ваши идентификаторы будут отличаться):

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Предположим, что идентификатор для mystack_web начинается с yyyyyyyyyyyy. Вы можете отфильтровать по этому идентификатору (или более короткому уникальному префиксу) следующим образом:

docker stack services mystack --filter id=yyyyyyyyyyyy

Замените yyyyyyyyyyyy на реальный начало идентификатора вашей службы mystack_web.

Эта команда отобразит только строку для службы с совпадающим идентификатором.

Вы должны увидеть вывод, похожий на следующий, показывающий только службу mystack_web:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

Аналогично, вы можете отфильтровать по идентификатору службы mystack_app. Найдите его идентификатор в выводе команды docker stack services mystack и используйте его в фильтре. Например, если идентификатор начинается с xxxxxxxxxxxx:

docker stack services mystack --filter id=xxxxxxxxxxxx

Замените xxxxxxxxxxxx на реальный начало идентификатора вашей службы mystack_app.

Это отобразит информацию о службе mystack_app:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

Фильтрация по идентификатору обеспечивает точный способ выбора конкретных служб, особенно в автоматических скриптах или при работе со службами, которые могут иметь похожие имена.

Форматирование вывода списка служб

На этом этапе вы научитесь форматировать вывод команды docker stack services. По умолчанию вывод отображается в удобочитаемом табличном формате. Однако вы можете использовать флаг --format для настройки вывода, что особенно полезно при написании скриптов или когда вам нужна определенная информация в другом формате.

Флаг --format принимает строку шаблона Go. Это позволяет вам точно указать, какие поля отображать и как их форматировать. Среди общих полей, которые вы, возможно, захотите отобразить, есть .ID, .Name, .Image, .Mode, .Replicas и .Ports.

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

docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"

В этой команде:

  • {{.ID}}, {{.Name}} и {{.Image}} - это заполнители шаблона Go, которые будут заменены соответствующими значениями для каждой службы.
  • \t представляет символ табуляции, используемый здесь в качестве разделителя.

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

xxxxxxxxxxxx	mystack_app	alpine:latest
yyyyyyyyyyyy	mystack_web	nginx:latest

(Помните, что идентификаторы будут различными в вашей среде).

Вы также можете отформатировать вывод в виде списка, что в некоторых случаях может быть легче для обработки. Например, чтобы вывести имя службы и количество реплик:

docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"

Это выведет:

- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)

Флаг --format предоставляет мощный способ адаптировать вывод команды docker stack services к вашим конкретным потребностям, упрощая интеграцию с другими инструментами или скриптами.

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

docker stack rm mystack

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

Резюме

В этом практическом занятии вы научились выводить список служб в стеке Docker с помощью команды docker stack services. Это включало в себя сначала установку Docker Compose и развертывание простого стека, определенного в файле docker-compose.yml. Затем вы использовали команду docker stack services <stack_name> для отображения таблицы всех служб в развернутом стеке.

В рамках практического занятия также рассматривалось фильтрование служб по имени и идентификатору (ID), что позволило вам сократить список до конкретных служб. Наконец, вы изучили, как форматировать вывод команды docker stack services для настройки отображаемой информации.