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

Как отслеживать журналы контейнеров Docker


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

Журналы содержат вывод, который вы увидите в своем терминале при подключении к контейнеру в интерактивном режиме (-it). Журналы будут доступны только в том случае, если процесс переднего плана в вашем контейнере действительно выдает некоторый вывод. Вы должны убедиться, что ваши контейнеры регистрируют ошибки в stderr, чтобы команды Docker могли выявлять их.

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

Просмотр журналов контейнеров

Чтобы просмотреть журналы контейнера, используйте команду docker logs:

docker logs my-container

Замените my-container именем или идентификатором контейнера, который вы хотите проверить. Вы можете использовать docker ps -a, чтобы получить идентификаторы и имена ваших контейнеров.

Команда logs выводит весь вывод журнала контейнера на ваш терминал. Вывод не будет непрерывным. Если вы хотите продолжать потоковую передачу новых журналов, добавьте в команду флаг --follow. Это эквивалентно использованию tail -f с обычными файлами журналов на вашем компьютере.

Настройка того, что отображается

Команда docker logs поддерживает несколько флагов, позволяющих настроить вывод:

  • –timestamps – отображать полные метки времени в начале каждой строки журнала.
  • -until и --since. Эти флаги позволяют получать строки, зарегистрированные в течение определенного периода времени. Либо передайте полную отметку времени (2021-04-30T20:00:00Z), либо удобное относительное время (например, 1h=1 час назад).
  • –tail — извлечь заданное количество строк из журнала. --tail 10 отобразит последние десять строк, зарегистрированных контейнером.
  • –details — это специальный флаг, который добавляет в вывод журнала дополнительную информацию на основе параметров, переданных драйверу ведения журнала. Мы рассмотрим регистрацию драйверов в следующем разделе. Типичные значения, отображаемые с помощью --details, включают метки контейнеров и переменные среды.

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

Драйверы ведения журнала Docker

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

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

Другие встроенные драйверы журналов включают syslog (запись в демон syslog, запущенный на вашем компьютере), journald (используйте работающий journald ) и fluentd (для использования демона fluentd). Также доступны драйверы для Amazon CloudWatch, Google Cloud Platform, Event Tracing для Windows и других решений для мониторинга журналов.

Docker поддерживает сторонние драйверы ведения журналов через плагины. Вы можете найти драйверы на Docker Hub. Чтобы установить драйвер подключаемого модуля, запустите docker plugin install plugin-name. Затем вы сможете ссылаться на него как на драйвер ведения журнала как plugin-name.

Указание драйвера ведения журнала

Вы можете указать драйвер ведения журнала для контейнера, передав флаг --log-driver в docker run:

docker run --log-driver systemd my-image:latest

Вы можете глобально изменить драйвер ведения журнала по умолчанию, обновив конфигурацию демона Docker. Отредактируйте (или создайте) /etc/docker/daemon.json. Задайте для ключа log-driver имя драйвера ведения журнала. Docker будет использовать этот драйвер для всех контейнеров, созданных без флага --log-driver.

{
    "log-driver": "systemd"
}

Многие драйверы ведения журнала поставляются со своими собственными параметрами конфигурации. Они устанавливаются с помощью флага контейнера --log-opts или log-opts в daemon.json. Вот пример, относящийся к драйверу json-file по умолчанию. Он предписывает Docker чередовать файлы журналов, если они превышают 8 МБ. Только пять файлов будут сохранены в любое время.

запуск докера

docker run --log-driver json-file --log-opts max-size=8M --log-opts max-file=5

/etc/docker/daemon.json

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "8M",
        "max-file": 5
    }
}

Режимы доставки драйверов

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

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

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

Вы можете включить неблокирующую доставку, установив параметр ведения журнала mode с помощью --log-opts или daemon.json. Вы можете установить размер буфера журнала в памяти с помощью параметра max-buffer-size. Установка этого высокого значения снижает риск потери журналов при условии, что у вас достаточно оперативной памяти.

docker run --log-opt mode=non-blocking --log-opt max-buffer-size=8M my-image:latest

Лучшие практики ведения журналов

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

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

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

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

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

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

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

Журналы включают в себя все, что генерируется стандартными потоками вывода контейнера. Вы можете использовать echo, print, console.log() или эквивалент вашего языка программирования, чтобы добавить строки в журналы docker вывод. Журналы сохраняются до тех пор, пока ваш контейнер не будет удален с помощью docker rm.




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