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 events, должно появиться несколько событий:
Каждое событие отображается в отдельной строке.
Сначала отображается временная метка события, затем тип затронутого объекта (например, образ или контейнер), а затем действие, которое было выполнено (например, создание, присоединение и запуск).
Оставшаяся часть сообщения содержит полезные метаданные об объекте.
Приведенный выше пример показывает, что был извлечен образ hello-world:latest и на его основе создан контейнер.
Форматирование вывода
Необработанный список событий часто бывает громоздким.
Вы можете изменить формат вывода с помощью флага –format, который принимает строку шаблона Go:
Выполнение этого примера даст результат, который выглядит следующим образом:
Вы можете получать события, представленные в виде объектов JSON, используя {{ json . }} в качестве строки шаблона:
Здесь необработанный 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 показывает только события, сохраненные с момента выполнения команды.
Вы можете включить исторические события, добавив флаг –since.
Этот флаг принимает человекочитаемое выражение времени или абсолютную временную метку:
События, записанные после указанного времени, будут немедленно показаны в вашем терминале.
Новые события будут продолжать отображаться в реальном времени по мере их записи.
Вы можете исключить события после определенного времени с помощью флага –until.
Он работает аналогично –since.
Использование –until отключает потоковую передачу новых событий в реальном времени, поскольку они выходят за пределы запрашиваемого периода времени.
Передача событий Docker из REST API демона
Другой способ доступа к сохраненным событиям – это REST API демона Docker.
Вы можете использовать /events для потоковой передачи событий в реальном времени после включения API на вашем хосте Docker.
События будут возвращены в формате JSON:
Конечная точка API поддерживает параметры filter, since и until, которые имеют такое же поведение, как и их аналоги в CLI.
Вот как получить все события создания контейнера, записанные за последний час:
Отправка событийyf внешнюю службу
В Docker отсутствует встроенный способ отправки событий во внешнюю службу.
Это может быть полезно, если вы хотите, чтобы все созданные вами контейнеры регистрировались в существующей платформе мониторинга или аудита.
Вы можете создать собственное решение, создав системную службу, которая постоянно запускает события docker.
Docker должен отправлять каждую новую строку вывода в вашу внешнюю систему.
Сначала напишем скрипт Bash, который реализует необходимую вам функциональность:
Теперь создайте новый юнит службы 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 создаются каждый раз, когда демон изменяет объекты в вашей среде.
Потоковая передача лога событий позволяет отслеживать активность демона в режиме реального времени.
Это может помочь вам в отладке проблем, аудите изменений и обеспечении соответствия требованиям.
см. также: