Введение
В этой лабораторной работе вы научитесь использовать команду docker compose events для мониторинга событий контейнеров. Мы начнём с подготовки простого проекта Docker Compose, включая установку Docker Compose и создание базового файла docker-compose.yml.
После настройки вы запустите сервисы, определённые в проекте, и будете наблюдать за генерируемыми базовыми событиями. Затем мы рассмотрим, как использовать флаг --json для вывода этих событий в структурированном JSON-формате. В заключение вы узнаете, как фильтровать события, чтобы отслеживать только те, которые относятся к определённым сервисам в вашем приложении Docker Compose.
Подготовка простого проекта 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.



