Как использовать команду docker system events для мониторинга активности Docker

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

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

Введение

В этом практическом занятии (лабораторной работе) вы научитесь эффективно отслеживать активность Docker с помощью команды docker system events. Вы начнете с прослушивания реального времени событий Docker, генерируемых такими действиями, как скачивание образов и запуск контейнеров.

Затем вы узнаете, как фильтровать эти события на основе различных критериев. Это включает фильтрацию по времени с использованием флагов --since и --until, фильтрацию по типу объекта и действию с использованием флага --filter и комбинирование нескольких фильтров для более точного мониторинга. Наконец, вы научитесь форматировать вывод событий для лучшей читаемости и анализа с помощью флага --format.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555248{{"Как использовать команду docker system events для мониторинга активности Docker"}} docker/ps -.-> lab-555248{{"Как использовать команду docker system events для мониторинга активности Docker"}} docker/pull -.-> lab-555248{{"Как использовать команду docker system events для мониторинга активности Docker"}} end

Прослушивание событий Docker в реальном времени

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

Для прослушивания событий Docker используется команда docker events. По умолчанию эта команда непрерывно выводит события по мере их возникновения.

Сначала откройте терминал и запустите команду docker events. Эта команда заблокирует выполнение и будет ожидать событий.

docker events

Теперь откройте новый терминал (оставьте первый терминал с запущенной командой docker events). В этом новом терминале мы запустим простой контейнер Docker. Это действие сгенерирует события, которые вы увидите в первом терминале.

В новом терминале выполните следующую команду для скачивания образа hello-world. Это сгенерирует событие pull.

docker pull hello-world

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

Далее запустите контейнер hello-world. Это сгенерирует события create, start и die.

docker run hello-world

Следите за выводом в первом терминале. Вы должны увидеть события, связанные с созданием, запуском и затем завершением (остановкой) контейнера.

Вы можете остановить команду docker events в первом терминале, нажав Ctrl+C.

Фильтрация событий по времени с использованием флагов --since и --until

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

Флаг --since позволяет просматривать события, произошедшие с определенного момента времени. Флаг --until позволяет просматривать события, произошедшие до определенного момента времени. Эти флаги можно использовать вместе, чтобы указать временной интервал.

Время можно указывать в различных форматах, включая формат даты RFC3339 (например, 2023-10-27T10:00:00Z), Unix - метки времени (например, 1698393600) или относительное время (например, 10m означает 10 минут назад, 1h означает 1 час назад).

Сначала сгенерируем несколько событий. Мы снова запустим контейнер hello - world.

docker run hello-world

Теперь попробуем просмотреть события, произошедшие за последние 5 минут. Мы можем использовать флаг --since с относительным временем.

docker events --since 5m

Вы должны увидеть события, связанные с запуском контейнера hello - world, который вы только что выполнили.

Далее попробуем просмотреть события, произошедшие за последние 10 минут, но не за последние 2 минуты. Мы можем использовать как флаг --since, так и флаг --until с относительным временем.

docker events --since 10m --until 2m

В зависимости от того, когда вы запустили контейнер hello - world, вы можете или не можете увидеть события. Если вы не видите никаких событий, попробуйте изменить временные диапазоны.

Вы также можете использовать абсолютные метки времени. Чтобы получить текущую Unix - метку времени, вы можете использовать команду date +%s.

Получим текущую метку времени.

date +%s

Теперь снова запустим контейнер hello - world.

docker run hello-world

Получим текущую метку времени еще раз.

date +%s

Теперь используйте две полученные метки времени с флагами --since и --until, чтобы просмотреть события, произошедшие между этими двумя моментами времени. Замените START_TIMESTAMP и END_TIMESTAMP на фактические метки времени, которые вы записали.

docker events --since START_TIMESTAMP --until END_TIMESTAMP

Вы должны увидеть события из запуска контейнера hello - world, которые произошли между двумя метками времени.

Фильтрация событий по типу объекта и действию с использованием флага --filter

На этом этапе вы научитесь фильтровать события Docker по типу объекта и действию с использованием флага --filter. Это позволяет вам сосредоточиться на определенных типах событий, таких как события контейнеров или события образов, а также на конкретных действиях, таких как create (создание), start (запуск), stop (остановка) или delete (удаление).

Флаг --filter принимает пару ключ-значение в формате key=value. Для фильтрации по типу объекта ключом является type, а значением может быть container (контейнер), image (образ), volume (том), network (сеть), daemon (демон) или plugin (плагин). Для фильтрации по действию ключом является event, а значением - конкретное действие.

Начнем с фильтрации только событий контейнеров. Мы снова запустим контейнер hello-world, чтобы сгенерировать события.

docker run hello-world

Теперь используйте команду docker events с флагом --filter type=container, чтобы просмотреть только события, связанные с контейнерами.

docker events --filter type=container --since 5m

Вы должны увидеть события, такие как create, start и die для контейнера hello-world, но не события, связанные с скачиванием образов.

Далее отфильтруем конкретное действие, например, только события start для контейнеров.

docker events --filter type=container --filter event=start --since 5m

Эта команда покажет только событие start для контейнера hello-world, если оно произошло за последние 5 минут.

Вы также можете фильтровать по имени или идентификатору объекта. Например, чтобы отфильтровать события для конкретного контейнера с именем my-container, вы должны использовать --filter container=my-container.

Запустим контейнер hello-world с определенным именем.

docker run --name my-hello-container hello-world

Теперь отфильтруем события конкретно для контейнера с именем my-hello-container.

docker events --filter container=my-hello-container --since 5m

Вы должны увидеть все события, связанные с контейнером my-hello-container, за последние 5 минут.

Фильтрация событий по нескольким критериям с использованием нескольких флагов --filter

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

При использовании нескольких флагов --filter Docker применяет логику "И". Это означает, что событие должно соответствовать всем указанным фильтрам, чтобы попасть в вывод.

Скомбинируем фильтрацию по типу объекта и действию. Отфильтруем события start (запуск) контейнеров.

Сначала запустим контейнер, чтобы сгенерировать событие start.

docker run hello-world

Теперь используем два флага --filter: один для типа объекта (type=container) и один для действия (event=start). Также используем --since 5m, чтобы ограничить временной диапазон.

docker events --filter type=container --filter event=start --since 5m

Вы должны увидеть только событие start для контейнера hello-world, если оно произошло за последние 5 минут. События, такие как create (создание) или die (завершение), будут исключены, так как они не соответствуют фильтру event=start.

Вы также можете комбинировать фильтрацию по времени, типу и действию. Например, отфильтруем события die (завершение) контейнеров, произошедшие за последние 10 минут, но не за последние 2 минуты.

docker events --filter type=container --filter event=die --since 10m --until 2m

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

Вы можете добавить еще больше фильтров, например, фильтрацию по имени контейнера или имени образа. Отфильтруем события start контейнера с именем my-specific-container, использующего образ ubuntu.

Сначала скачаем образ ubuntu.

docker pull ubuntu

Теперь запустим контейнер ubuntu с определенным именем.

docker run --name my-specific-container ubuntu echo "Hello from Ubuntu"

Теперь отфильтруем события start контейнера с именем my-specific-container.

docker events --filter type=container --filter event=start --filter container=my-specific-container --since 5m

Вы должны увидеть событие start для контейнера my-specific-container, если оно произошло за последние 5 минут.

Форматирование вывода событий с использованием флага --format

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

Флаг --format использует синтаксис пакета text/template языка Go. Вы можете обращаться к различным полям объекта события, таким как .Time, .Type, .Action, .Actor.ID и .Actor.Attributes.

Начнем с отображения времени, типа и действия каждого события.

Сначала сгенерируем несколько событий, запустив контейнер hello-world.

docker run hello-world

Теперь используем команду docker events с флагом --format, чтобы указать желаемый формат вывода. Мы отобразим время, тип и действие, разделенные табуляцией (\t).

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}'

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

2023-10-27 10:30:00.123456789 +0000 UTC	container	create
2023-10-27 10:30:00.987654321 +0000 UTC	container	start
2023-10-27 10:30:01.567890123 +0000 UTC	container	die

Вы также можете получить доступ к атрибутам объекта (actor), который вызвал событие. Например, чтобы отобразить имя контейнера, вы можете использовать .Actor.Attributes.name.

Запустим контейнер hello-world с именем еще раз.

docker run --name my-formatted-container hello-world

Теперь отформатируем вывод так, чтобы он включал имя контейнера.

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}\t{{.Actor.Attributes.name}}'

Теперь вывод должен включать имя контейнера:

2023-10-27 10:35:00.123456789 +0000 UTC	container	create	my-formatted-container
2023-10-27 10:35:00.987654321 +0000 UTC	container	start	my-formatted-container
2023-10-27 10:35:01.567890123 +0000 UTC	container	die	my-formatted-container

Вы можете использовать различные функции шаблонов и управляющие структуры в строке формата для более сложного форматирования. Подробности можно найти в документации по пакету text/template языка Go.

Резюме

В этом практическом занятии (лабораторной работе) вы научились использовать команду docker events для мониторинга активности Docker в режиме реального времени. Вы начали с прослушивания всех событий Docker по мере их возникновения, наблюдая за событиями, генерируемыми при скачивании и запуске простого контейнера.

Затем вы изучили, как фильтровать эти события по различным критериям. Вы научились фильтровать события по времени с использованием флагов --since и --until для просмотра событий в определенном временном диапазоне. Вы также узнали, как фильтровать события по типу объекта и действию с помощью флага --filter, а также как применять несколько фильтров одновременно для сужения потока событий. Наконец, вы научились форматировать вывод команды docker events с помощью флага --format для лучшей читаемости и разбора.