🐳 Как просмотреть историю событий Docker |

🐳 Как просмотреть историю событий Docker

Мануал

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

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

В этой статье мы объясним, что фиксируется как события и как их просмотреть.

Затем мы покажем, как отслеживать события в режиме реального времени с помощью Docker CLI и REST API.

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

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

В этой статье мы объясним, что фиксируется как события и когда вы можете захотеть их просмотреть.

Затем мы покажем, как отслеживать события в режиме реального времени с помощью Docker CLI и REST API.

Что такое события Docker?

События Docker описывают действия, выполняемые демоном Docker.

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

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

  • Создание и удаление контейнеров
  • Статусы проверки работоспособности контейнеров
  • Команды, выполняемые внутри контейнеров с помощью docker exec
  • Пуш и пул образов
  • Создание, уничтожение, монтирование и размонтирование томов
  • Включение и отключение плагинов демонов Docker.
  • Полный список можно посмотреть в документации Docker.

Каждое записанное событие содержит метку времени и идентификатор затронутого объекта.

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

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

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

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

Передача событий Docker с помощью Docker CLI

Команда docker events CLI транслирует события от вашего демона Docker в окно терминала.

События будут появляться в реальном времени до тех пор, пока вы не завершите процесс нажатием комбинации клавиш Ctrl+C.

docker cli

Выполнение команды без аргументов не покажет никаких результатов.

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

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

docker run --rm hello-world

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

2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world)
2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Каждое событие отображается в отдельной строке.

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

Оставшаяся часть сообщения содержит полезные метаданные об объекте.

Приведенный выше пример показывает, что был извлечен образ hello-world:latest и на его основе создан контейнер.

Форматирование вывода

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

Вы можете изменить формат вывода с помощью флага –format, который принимает строку шаблона Go:

docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'

Выполнение этого примера даст результат, который выглядит следующим образом:

1654006800 pull image hello-world:latest
1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

Вы можете получать события, представленные в виде объектов JSON, используя {{ json . }} в качестве строки шаблона:

docker events --format '{{ json . }}' | jq
{
"status": "create",
"id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"from": "hello-world",
"Type": "container",
"Action": "create",
"Actor": {
"ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"Attributes": {
"image": "hello-world",
"name": "nifty_morse"
}
},
"scope": "local",
"time": 1654006800,
"timeNano": 1654006800347054800
}

Здесь необработанный JSON передается через jq, так что он будет выведен в терминале.

☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux

Это облегчает сканирование информации.

В большинстве случаев вам нужно будет писать первую букву каждого свойства с заглавной буквы, например, time – {{ .Time }}.

Фильтрация событий

Журнал событий для загруженного демона Docker может быстро стать шумным.

Вы можете сузить круг событий до определенного действия, объекта или типа объекта с помощью флага –filter:

  • docker events –filter type=container – Получить все события, относящиеся к контейнерам.
  • docker events –filter event=create – Получить события создания контейнера.
  • docker events –filter container=demo-container – Получить все события, сохраненные для контейнера под названием demo-container (можно сослаться на ID или имя контейнера).

Кроме контейнера, вы можете фильтровать по всем поддерживаемым именам типов объектов, таким как образ, сеть и том.

При повторении флага –filter поддерживается несколько фильтров.

Различные фильтры интерпретируются как логические условия AND; несколько применений одного и того же фильтра становятся условиями OR.

Вот пример, в котором событие create используется для контейнеров app-container и api-container:

docker events \
--filter container=app-container
--filter container=api-container
--filter event=create

Доступ к историческим событиям

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

Вы можете включить исторические события, добавив флаг –since.

Этот флаг принимает человекочитаемое выражение времени или абсолютную временную метку:

docker events --since 1h
docker events --since '2021-05-01T16:00:00'

События, записанные после указанного времени, будут немедленно показаны в вашем терминале.

Новые события будут продолжать отображаться в реальном времени по мере их записи.

Вы можете исключить события после определенного времени с помощью флага –until.

Он работает аналогично –since.

Использование –until отключает потоковую передачу новых событий в реальном времени, поскольку они выходят за пределы запрашиваемого периода времени.

Передача событий Docker из REST API демона

Другой способ доступа к сохраненным событиям – это REST API демона Docker.

Вы можете использовать /events для потоковой передачи событий в реальном времени после включения API на вашем хосте Docker.

События будут возвращены в формате JSON:

curl http://127.0.0.1:2375/v1.41/events
{
"Type": "container",
"Action": "create",
"Actor": {
"ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"Attributes": {
"image": "hello-world",
"name": "nifty_morse"
}
},
"scope": "local",
"time": 1654006800,
"timeNano": 1654006800347054800

Конечная точка API поддерживает параметры filter, since и until, которые имеют такое же поведение, как и их аналоги в CLI.

Вот как получить все события создания контейнера, записанные за последний час:

curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}

Отправка событийyf внешнюю службу

В Docker отсутствует встроенный способ отправки событий во внешнюю службу.

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

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

Docker должен отправлять каждую новую строку вывода в вашу внешнюю систему.

Сначала напишем скрипт Bash, который реализует необходимую вам функциональность:

!/bin/bash
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | while read event
do
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"event": "$event"}' \
https://example.com/events
done

Теперь создайте новый юнит службы systemd по адресу /etc/systemd/system/docker-events.service:

[Unit]
Description=Custom Docker Event Monitoring Service

[Service]
Type=forking
ExecStart=/usr/local/bin/docker-events.sh

[Install]
WantedBy=multi-user.target

Наконец, перезагрузите systemd, чтобы загрузить вашу службу, затем запустите и включите юнит:

$ sudo systemctl daemon-reload
$ sudo systemctl start docker-events
$ sudo systemctl enable docker-events

Теперь ваша служба будет передавать каждое новое событие на вашу платформу мониторинга.

Включение службы настраивает ее на автоматический запуск при каждой перезагрузке хоста.

Заключение

Cобытия Docker создаются каждый раз, когда демон изменяет объекты в вашей среде.

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

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

см. также:

Добавить комментарий