Поиск по сайту:

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


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

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

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

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

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

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

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

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

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

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

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

$ 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 в качестве эталона для поддерживаемых заполнителей. В большинстве случаев вам потребуется использовать заглавную букву в каждом свойстве, например, от 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:

$ 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 из Daemon 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'}

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

В 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

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

Краткое содержание

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

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




Все права защищены. © Linux-Console.net • 2019-2024