Перейти к основному содержимому

Руководство по журналам Docker

· 7 мин. чтения

1. Обзор

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

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

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

В этом руководстве мы рассмотрим различные способы доступа к журналам Docker.

2. Понимание журналов Docker

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

В первую очередь мы рассмотрим различные команды для доступа к журналам контейнера Docker. Мы изучим журналы контейнера с помощью команды docker logs и прямого доступа к файлу журналов в системе.

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

3. Использование команды docker logs

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

$ docker run -itd -e POSTGRES_USER=foreach -e POSTGRES_PASSWORD=foreach -p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
214ca5fb9032: Pull complete
...
95df4ec75c64: Pull complete
Digest: sha256:2c954f8c5d03da58f8b82645b783b56c1135df17e650b186b296fa1bb71f9cfd
Status: Downloaded newer image for postgres:latest
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a

Для иллюстрации давайте проверим containerId контейнера postgresql -baedlung :

$ docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bce34bb3c617 postgres "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresql-baedlung

Как видно из вывода приведенной выше команды, postgresql-baedlung работает с идентификатором контейнера «bce34bb3c617». Давайте теперь рассмотрим команду docker logs для мониторинга журналов:

$ docker logs bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv6 address "::", port 5432

Здесь журналы содержат данные выходного потока с отметкой времени. Приведенная выше команда не содержит непрерывный вывод журнала. Чтобы просмотреть непрерывный вывод журнала контейнера, нам нужно использовать параметр «-follow» в команде docker logs .

Параметр «-follow» — один из самых полезных параметров Docker, поскольку он позволяет нам отслеживать живые журналы контейнера:

$ docker logs --follow  bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections

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

$ docker logs --follow --tail 1 bce34bb3c617
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections

Мы также можем использовать опцию « с тех пор» с командой журнала docker для просмотра файла с определенного времени:

$ docker logs --since 2022-05-16  bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections

В качестве альтернативы мы также можем использовать команду docker container logs вместо команды docker logs :

$ docker container logs --since 2022-05-16  bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections

Здесь мы можем видеть из приведенного выше вывода, что обе команды работают одинаково. Команда docker container logs устарела в более новых версиях.

4. Использование файла журнала по умолчанию

Docker хранит все выходные данные STDOUT и STDERR в формате JSON. Кроме того, можно отслеживать все живые журналы Docker с хост-компьютера. По умолчанию Docker хранит файлы журнала в выделенном каталоге на хосте с помощью драйвера журнала json-file . Каталог файла журнала — /var/lib/docker/containers/<container_id> на хосте, на котором запущен контейнер.

Чтобы продемонстрировать, давайте проверим файл журнала нашего контейнера postgress-foreach :

$ cat /var/lib/docker/containers/bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a/
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a-json.log
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833312658Z"}
{"log":"PostgreSQL Database directory appears to contain a database; Skipping initialization\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833360038Z"}
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833368499Z"}

В приведенном выше выводе мы видим, что данные представлены в формате JSON.

5. Очистка файла журнала

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

Ниже приведена команда для очистки всех файлов журнала, хранящихся на хост-компьютере:

$ truncate -s 0 /var/lib/docker/containers/*/*-json.log

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

$ truncate -s 0 /var/lib/docker/containers/dd207f11ebf083f97355be1ae18420427dd2e80b061a7bf6fb0afc326ad04b10/*-json.log

При запуске контейнера мы также можем ограничить размер файла журнала извне, используя параметры «-log-opt max-size» и « -log-opt max-file» команды запуска docker :

$ docker run --log-opt max-size=1k --log-opt max-file=5 -itd -e POSTGRES_USER=foreach -e POSTGRES_PASSWORD=foreach -p 5432:5432
-v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32

Теперь давайте проверим количество файлов журнала и размер файла журнала в каталоге /var/lib/docker/containers/3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32 :

$ ls -la
total 68
drwx------. 4 root root 4096 May 17 02:06 .
drwx------. 5 root root 222 May 17 02:07 ..
drwx------. 2 root root 6 May 17 02:02 checkpoints
-rw-------. 1 root root 3144 May 17 02:02 config.v2.json
-rw-r-----. 1 root root 587 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log
-rw-r-----. 1 root root 1022 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.1
-rw-r-----. 1 root root 1061 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.2
-rw-r-----. 1 root root 1056 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.3
-rw-r-----. 1 root root 1058 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.4
-rw-r--r--. 1 root root 1501 May 17 02:02 hostconfig.json
-rw-r--r--. 1 root root 13 May 17 02:02 hostname
-rw-r--r--. 1 root root 174 May 17 02:02 hosts
drwx------. 2 root root 6 May 17 02:02 mounts
-rw-r--r--. 1 root root 69 May 17 02:02 resolv.conf
-rw-r--r--. 1 root root 71 May 17 02:02 resolv.conf.hash

Здесь мы видим, что создано пять файлов журнала, и размер каждого файла журнала составляет не более 1 КБ. Если мы удалим некоторые файлы журнала, в этом случае мы создадим новый журнал с тем же именем файла журнала.

Мы также можем предоставить конфигурацию максимального размера журнала и максимального файла в файле /etc/docker/daemon.json . Давайте посмотрим на конфигурацию файла daemon.json:

{
"log-driver": "json-file",
"log-opts": {
"max-size": "1k",
"max-file": "5"
}
}

Здесь мы предоставили ту же конфигурацию в daemon.json, и, что важно, все новые контейнеры будут работать с этой конфигурацией. После обновления файла daemon.json нам потребуется перезапустить службу Docker.

6. Перенаправление журналов контейнера Docker в один файл

По умолчанию файлы журналов контейнеров Docker хранятся в каталоге /var/lib/docker/containers/<containerId> . Кроме того, мы также можем перенаправить журналы контейнеров Docker в какой-либо другой файл.

Для иллюстрации давайте рассмотрим команду для перенаправления журнала контейнера:

$ docker logs -f containername &> foreach-postgress.log &

Здесь, в приведенной выше команде, мы перенаправляем все живые журналы в файл foreach-postgress.log . Кроме того, мы запускаем эту команду в фоновом режиме с помощью & , поэтому она будет выполняться до тех пор, пока не будет явно остановлена.

7. Заключение

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

Наконец, мы рассмотрели очистку и перенаправление файла журнала. Короче говоря, мы изучили мониторинг и усечение файла журнала.