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
для мониторинга живых журналов. Позже мы отслеживали журналы, используя файл журнала контейнеров по умолчанию.
Наконец, мы рассмотрели очистку и перенаправление файла журнала. Короче говоря, мы изучили мониторинг и усечение файла журнала.