Как использовать команду docker compose events для мониторинга событий контейнеров

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

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

Введение

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

После настройки вы запустите сервисы, определённые в проекте, и будете наблюдать за генерируемыми базовыми событиями. Затем мы рассмотрим, как использовать флаг --json для вывода этих событий в структурированном JSON-формате. В заключение вы узнаете, как фильтровать события, чтобы отслеживать только те, которые относятся к определённым сервисам в вашем приложении Docker Compose.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555078{{"Как использовать команду docker compose events для мониторинга событий контейнеров"}} docker/start -.-> lab-555078{{"Как использовать команду docker compose events для мониторинга событий контейнеров"}} docker/stop -.-> lab-555078{{"Как использовать команду docker compose events для мониторинга событий контейнеров"}} docker/pull -.-> lab-555078{{"Как использовать команду docker compose events для мониторинга событий контейнеров"}} end

Подготовка простого проекта Docker Compose

На этом шаге мы подготовим простой проект Docker Compose. Поскольку Docker Compose не предустановлен в среде LabEx, сначала мы его установим. Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью Compose вы используете YAML-файл для настройки сервисов вашего приложения. Затем одной командой создаёте и запускаете все сервисы из конфигурации.

Сначала установим 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 --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2.

Теперь создадим директорию для нашего проекта и перейдём в неё. Мы создадим простой проект с одним сервисом.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

Далее создадим файл docker-compose.yml в этой директории. Этот файл будет определять наш сервис. Мы используем редактор nano для создания и редактирования файла.

nano docker-compose.yml

В редакторе nano вставьте следующее содержимое. Эта конфигурация определяет сервис с именем web, использующий образ nginx:latest.

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

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

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

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

Перед запуском сервиса загрузим образ nginx:latest. Хотя Docker Compose загрузит образ, если он отсутствует, предварительная загрузка иногда может быть полезной.

docker pull nginx:latest

Вы должны увидеть вывод, указывающий на загрузку образа.

Теперь у нас готов файл docker-compose.yml и загружен необходимый образ. На следующем шаге мы запустим сервис, определённый в этом файле.

Запуск сервисов и наблюдение за базовыми событиями

На этом шаге мы запустим сервисы, определённые в нашем файле docker-compose.yml, и будем наблюдать за базовыми событиями, генерируемыми Docker. События Docker — это информация в реальном времени о том, что происходит с вашим демоном Docker и контейнерами, например создание, запуск, остановка и удаление контейнеров.

Сначала убедитесь, что находитесь в директории ~/project/my-compose-app, где вы создали файл docker-compose.yml на предыдущем шаге.

cd ~/project/my-compose-app

Теперь мы используем команду docker-compose up для запуска сервиса. Флаг -d запускает контейнеры в detached mode (фоновом режиме), что означает их работу в фоне без блокировки терминала.

docker-compose up -d

Вы должны увидеть вывод, указывающий на создание сети и контейнера сервиса web.

[+] Running 2/2
 ⠿ Network my-compose-app_default  Created
 ⠿ Container my-compose-app-web-1  Started

Для наблюдения за базовыми событиями Docker мы используем команду docker events. Эта команда выводит поток событий от демона Docker.

docker events

Вы увидите непрерывный поток событий, связанных с вашей средой Docker. Поскольку мы только что запустили контейнер, вы должны увидеть события, связанные с созданием, запуском и другими действиями для контейнера my-compose-app-web-1. Вывод будет выглядеть примерно так (временные метки и детали могут отличаться):

2023-10-27T10:00:00.123456789Z container create 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
2023-10-27T10:00:01.987654321Z container start 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
...

Команда docker events будет продолжать работать и отображать новые события по мере их возникновения. Чтобы остановить команду и вернуться в терминал, нажмите Ctrl + C.

Вы также можете проверить состояние работающего контейнера с помощью команды docker ps.

docker ps

Вы должны увидеть контейнер my-compose-app-web-1 со статусом Up.

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
...            nginx:latest   "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   my-compose-app-web-1

На этом шаге мы успешно запустили наш сервис Docker Compose и пронаблюдали базовые события Docker. В следующем шаге мы рассмотрим, как выводить эти события в формате JSON.

Использование флага --json для вывода событий в формате JSON

На этом шаге мы научимся выводить события Docker в формате JSON с помощью флага --json команды docker events. Вывод событий в формате JSON полезен для программной обработки и интеграции с другими инструментами.

Сначала убедитесь, что находитесь в директории ~/project/my-compose-app.

cd ~/project/my-compose-app

Теперь запустим команду docker events с флагом --json. Это будет выводить события в формате JSON.

docker events --json

Вы увидите непрерывный поток JSON-объектов, где каждый объект представляет событие Docker. Вывод будет выглядеть примерно так (детали могут отличаться):

{"status":"create","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"create","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886400,"timeNano":1678886400123456789}
{"status":"start","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"start","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886401,"timeNano":1678886401987654321}
...

Каждая строка представляет собой валидный JSON-объект, содержащий детальную информацию о событии, такую как status, id затронутого объекта, Type, Action и детали Actor, включая Attributes (например, имя образа и имя контейнера).

Для демонстрации захвата этих событий давайте остановим, а затем снова запустим сервис web, пока команда docker events --json выполняется в другом терминале или фоне. Поскольку в этой лаборатории мы используем один терминал, сначала остановим команду docker events --json, нажав Ctrl + C.

Теперь остановим сервис web.

docker-compose stop web

Вы должны увидеть вывод, указывающий на остановку контейнера web.

[+] Stopping 1/1
 ⠿ Container my-compose-app-web-1  Stopped

Теперь запустим docker events --json в фоновом режиме и снова запустим сервис. Мы используем символ & для запуска команды в фоне.

docker events --json &

Вы увидите идентификатор процесса (PID), указывающий, что команда выполняется в фоне.

Теперь снова запустим сервис web.

docker-compose start web

Вы должны увидеть вывод, указывающий на запуск контейнера web.

[+] Starting 1/1
 ⠿ Container my-compose-app-web-1  Started

Команда docker events --json, выполняемая в фоне, зафиксирует события stop и start. Чтобы увидеть вывод фонового процесса, может потребоваться перевести его на передний план с помощью команды fg или проверить вывод терминала после остановки фонового процесса. Однако для целей этого шага достаточно просто запустить команду с --json, чтобы понять формат вывода.

Чтобы остановить фоновый процесс docker events --json, можно использовать команду jobs для списка фоновых задач и затем kill %<номер_задачи>. Альтернативно можно найти идентификатор процесса с помощью ps aux | grep 'docker events --json' и использовать команду kill с PID. В данном контексте проще просто перейти к следующему шагу, так как фоновый процесс не будет существенно мешать.

На этом шаге мы успешно использовали флаг --json для просмотра событий Docker в структурированном JSON-формате, что ценно для автоматизации и анализа.

Фильтрация событий для конкретных сервисов

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

Команда docker events поддерживает фильтрацию с помощью флага --filter. Вы можете фильтровать по различным критериям, таким как container, image, event, label и другим.

Сначала убедитесь, что находитесь в директории ~/project/my-compose-app.

cd ~/project/my-compose-app

Наш сервис назван web в файле docker-compose.yml, а имя контейнера, генерируемое Docker Compose, обычно имеет формат <имя_проекта>_<имя_сервиса>_<номер_экземпляра>. В нашем случае имя проекта — my-compose-app (производное от имени директории), имя сервиса — web, а номер экземпляра — 1. Таким образом, имя контейнера — my-compose-app-web-1.

Давайте отфильтруем события, чтобы показывать только те, что связаны с нашим контейнером web. Мы можем использовать фильтр container с именем контейнера.

docker events --filter container=my-compose-app-web-1

Теперь эта команда будет отображать только события, где затронутым объектом является контейнер с именем my-compose-app-web-1. Чтобы увидеть это в действии, давайте остановим и снова запустим сервис web, пока эта команда выполняется.

Сначала остановите команду docker events, нажав Ctrl + C.

Теперь запустим фильтрованную команду docker events в фоновом режиме.

docker events --filter container=my-compose-app-web-1 &

Вы увидите идентификатор фонового процесса.

Теперь остановите сервис web с помощью Docker Compose.

docker-compose stop web

Вы должны увидеть вывод, указывающий на остановку контейнера. Фоновая команда docker events должна зафиксировать событие stop для контейнера my-compose-app-web-1.

Затем снова запустите сервис web.

docker-compose start web

Вы должны увидеть вывод, указывающий на запуск контейнера. Фоновая команда docker events должна зафиксировать событие start для контейнера my-compose-app-web-1.

Вы также можете фильтровать по другим критериям. Например, для фильтрации событий по образу можно использовать --filter image=nginx:latest.

Чтобы остановить фоновый процесс docker events, можно использовать jobs и kill %<номер_задачи> или найти PID и использовать kill <PID>. Для этой лабораторной работы можно просто продолжить.

Наконец, давайте очистим запущенные контейнеры и сеть, созданные Docker Compose.

docker-compose down

Эта команда остановит и удалит контейнеры, сети и тома, определённые в файле docker-compose.yml.

[+] Running 2/1
 ⠿ Container my-compose-app-web-1  Removed
 ⠿ Network my-compose-app_default  Removed

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

Итоги

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

После настройки проекта мы запустили сервисы и наблюдали базовые события, генерируемые Docker Compose. Затем мы рассмотрели, как выводить эти события в формате JSON с помощью флага --json для упрощения обработки и анализа. В завершение мы научились фильтровать события, чтобы отслеживать только те, что относятся к конкретным сервисам в нашем проекте Docker Compose.