Как просмотреть историю событий вашей установки Docker

Опубликовано: 2022-08-11

Логотип докера

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

В этой статье мы объясним, что фиксируется как события и когда вы можете захотеть их просмотреть. Затем мы покажем, как отслеживать события в режиме реального времени с помощью Docker CLI и REST API.

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

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

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

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

Вы можете просмотреть полный список в документации Docker.

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

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

Потоковая передача событий Docker с помощью интерфейса командной строки Docker

Команда CLI docker events передает события от вашего демона Docker в окно терминала. События будут появляться в режиме реального времени, пока вы не завершите процесс, нажав комбинацию клавиш Ctrl+C.

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

 $ docker run --rm привет-мир

Теперь в окне терминала, где запущена команда 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 создание контейнера 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 подключение контейнера 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 запуск контейнера 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...

Каждое событие отображается в отдельной строке. Сначала отображается временная метка события, за которой следует тип затронутого объекта (например, image или container ), а затем предпринятое действие (например, create , attach и start ). Остальная часть сообщения содержит полезные метаданные об объекте. В приведенном выше примере показано, что изображение hello-world:latest было извлечено и на его основе создан контейнер.

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

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

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

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

 1654006800 вытащить изображение привет-мир: последний
1654006800 создать контейнер 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 прикрепить контейнер 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 стартовый контейнер 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378

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

 $ docker events --format '{{ json . }}' | jq
{
  "статус": "создать",
  "id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
  "от": "привет-мир",
  "Тип": "контейнер",
  «Действие»: «создать»,
  "Актер": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Атрибуты": {
      "изображение": "привет-мир",
      "имя": "nifty_morse"
    }
  },
  "область": "местный",
  "время": 1654006800,
  "таймнано": 1654006800347054800
}

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

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

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

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

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

Помимо container , вы можете фильтровать по именам всех поддерживаемых типов объектов, таких как image , network и volume .

Несколько фильтров поддерживаются, когда вы повторяете флаг --filter . Отдельные фильтры интерпретируются как логические условия И ; многократное использование одного и того же фильтра становится предложением ИЛИ . Вот пример, который отображает событие create как app-container так и для контейнера api-container контейнера:

 $ события докера \
    --filter container=контейнер приложения
    --filter container=api-контейнер
    --filter событие=создать

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

docker events по умолчанию отображают только события, сохраненные с момента запуска команды. Вы можете включить исторические события, добавив флаг --since . Это принимает удобочитаемое выражение времени или абсолютную метку времени:

 $ событий докера -- с 1 часа
$ события докера -- с '2021-05-01T16:00:00'

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

Вы можете исключить события после определенного времени с помощью флага --until . Он работает аналогично --since . Использование --until отключит потоковую передачу новых событий в реальном времени, поскольку они выйдут за пределы запрошенного периода времени.

Потоковая передача событий Docker из Daemon REST API

Другой способ доступа к сохраненным событиям — через REST API демона Docker. Вы можете использовать конечную точку /events для потоковой передачи событий в режиме реального времени после включения API на своем хосте Docker. События будут возвращены в формате JSON:

 $ завиток http://127.0.0.1:2375/v1.41/события
{
  "Тип": "контейнер",
  «Действие»: «создать»,
  "Актер": {
    "ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
    "Атрибуты": {
      "изображение": "привет-мир",
      "имя": "nifty_morse"
    }
  },
  "область": "местный",
  "время": 1654006800,
  "таймнано": 1654006800347054800
}

Конечная точка API поддерживает filter , параметры since и until , которые ведут себя так же, как и их аналоги в интерфейсе командной строки. Вот как получить все события создания контейнера, записанные за последний час:

 $ curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'тип':'контейнер','действие':'создать'}

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

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

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

Сначала напишите Bash-скрипт, реализующий нужный вам функционал:

 #!/бин/баш
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | во время чтения события
делать
    завиток \
        -X ПОСТ \
        -H "Тип контента: приложение/json" \
        -d '{"событие": "$event"}' \
        https://example.com/events
Выполнено

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

 [Ед. изм]
Description=Пользовательская служба мониторинга событий Docker

[Обслуживание]
Тип = разветвление
ExecStart=/usr/local/bin/docker-events.sh

[Установить]
WantedBy=многопользовательская.цель

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

 $ sudo systemctl демон-перезагрузка
$ sudo systemctl запустить докер-события
$ sudo systemctl включить события докера

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

Резюме

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

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