Важно знать, как работают логи в Docker при повседневном администрировании системы, будь то устранение неполадок или базовый мониторинг. Без отслеживания журналов логов в Docker устранение неполадок при расследовании аномалий было бы намного сложнее.
В этой статье рассматривается некоторая важная информация в этой области, чтобы было проще понять, как управлять файлами логов связанными с Docker, в вашей системе Linux.
Начнем изучение от простого к сложному с постепенным углублением в некоторые особенности.
Как просмотреть журналы Docker
Вы можете использовать команду docker logs
для получения информации о том, что происходит со службой внутри запущенного контейнера.
Синтаксис прост:
docker logs container_name_or_ID
Вы, наверное, уже знаете, что можете использовать команду docker ps для просмотра имени и идентификатора запущенных контейнеров.
Давайте возьмем реальный пример. Я развернул Nextcloud с помощью Docker. Контейнер называется nextcloud, что неудивительно.
Теперь, чтобы просмотреть журналы контейнера с именем nextcloud
, используйте:
docker logs nextcloud
Вот усеченная версия выходных данных приведенной выше команды:
172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
Слишком много данных? Хорошо то, что существуют различные опции, которые значительно упрощают просмотр журналов docker, точно так же, как журналы в Linux.
Откроем для просмотра только определенное количества строк
Команда Docker logs имеет --tail
атрибут, который можно использовать аналогично команде tail.
Это означает, что вы можете использовать это для отображения только определенного количества строк журналов Docker с конца.
Например, чтобы просмотреть последние 50 строк контейнера, вы можете использовать:
docker logs --tail 50 container_name_or_ID
Вы также можете использовать приведенную выше команду таким же образом
docker logs -n=50 container_name_or_ID
Просмотр журналов Docker в режиме реального времени в реальном контейнере
Вы можете полностью просматривать журналы контейнера в режиме реального времени. Чтобы “следить” за журналами, используйте атрибут --follow
или -f
.
docker logs -f container_name_or_ID
Когда вы запустите журналы docker с опцией «Следить», вы заметите, что со временем из контейнера будут выводиться новые строки журнала.
Для выхода вы можете просто использовать комбинацию клавиш Ctrl + C и вернуться к командной строке терминала.
Большинство параметров в docker logs
подкоманде можно комбинировать для получения желаемого результата.
Например, docker logs -f
заполнит экран всеми журналами с самого начала. Вы бы этого не хотели. Что вы можете сделать, так это объединить оба tail
и follow
подобные опции:
docker logs -f --tail 20 container_name_or_ID
Приведенная выше команда покажет последние 20 строк журналов, а затем будет следить за журналами в режиме реального времени.
При обновлении контейнеров вашего приложения с помощью масштабирования приведенная выше команда может быть очень полезна перед удалением старого контейнера.
Просмотреть временную метку в журналах Docker
Если вы также хотите просмотреть временные метки записей журнала, вы можете использовать опцию -t
.
docker logs -t container_name_or_ID
Это можно легко комбинировать с другими опциями, такими как --follow
и --tail
.
Приведенная ниже команда покажет последние 10 строк файла журнала данного контейнера с временными метками, прикрепленными к каждой из них
docker logs -n=10 -t container_name_or_ID
Просмотр журналов Docker за указанный период времени
При расследовании проблемы время может быть критическим фактором, и в этом случае флаги --since
и --until
могут оказаться очень полезными.
Например, если вы исследуете проблему, возникшую за последние 24 часа, следующая команда покажет зарегистрированное содержимое всего, что произошло, только за это время:
docker logs --since 1440m -t container_name_or_ID
1440m
в приведенной выше команде указано 24 × 60 минут. Добавление флага -t
или --timestamps
гарантирует, что строки отчетов будут помечены временной меткой, чтобы вам было еще проще анализировать инциденты или ошибки. Я бы предложил добавлять это при запросе любого контейнера.
Аналогично, если вам требуются сведения о журнале после первых 24 часов начала развертывания, эквивалентной командой будет:
docker logs --until 1440m -t nextcloud
Помимо указания времени в минутах, два вышеупомянутых флага также можно использовать с определенной временной меткой, которая -t
генерируется. Формат like 2021-07-28T06:20:00
.
docker logs --since 2021-07-28 -t container_name_or_ID
Приведенная выше команда покажет журналы с 28 июля 2021 года.Для получения полного обзора журналов docker вы также можете проверить его справочную страницу с помощью man docker-logs.
Доступ к журналам Docker из контейнера
В некоторых интересных вариантах использования вы можете захотеть использовать гибридный подход, при котором вы получаете доступ к журналам конкретного приложения из контейнеров.
Для этого вы входите в контейнер Docker:
docker exec -it container_name_or_ID sh
А затем вы можете использовать обычные инструменты Linux для получения журналов, связанных с приложениями. Одним из подходов было бы получить идентификатор процесса желаемой службы с помощью команды ps:
ps aux
Получите подробную информацию об этом процессе:
cat /proc/PID_of_process/fd/1
Журналы системных служб Docker
Если вы хотите просмотреть журналы самой службы Docker на хосте, вы можете использовать journalctl, если вы используете Ubuntu 16.04 или более позднюю версию:
sudo journalctl -u docker
Где хранятся журналы Docker?
Вы должны найти журналы docker в каталоге /var/lib/docker/containers в хост-системе. Этот каталог содержит файлы журналов, относящиеся ко всем контейнерам в их отдельных каталогах. Вы можете идентифицировать каталоги с помощью идентификатора контейнера.
Я использовал docker ps
, чтобы найти, что 70f19fde9076
это идентификатор контейнера Nextcloud.
Если я загляну в каталог, где хранятся журналы docker:
avimanyu@localhost:~$ sudo ls -lh /var/lib/docker/containers
total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7
В настоящее время запущено четыре контейнера, и вы можете видеть, что третий соответствует тому, который нам нужно изучить (он начинается с 70f19fde9076
).
Если вы проверите содержимое этого каталога, вы увидите, что наш файл журнала находится прямо там!
avimanyu@localhost:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root 13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root 198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root 79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root 71 Jul 27 18:58 resolv.conf.hash
Следовательно, соответствующий файл журнала — 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e.log который является тем же файлом, который вы читали, когда я запускал docker logs
команду в начале.
Позвольте мне быстро убедиться в этом:
avimanyu@localhost:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}
Содержимое журнала такое же, но поскольку я читаю файл журнала непосредственно с хоста, в нем много жаргонных выражений по сравнению с docker logs
командой, использованной ранее.
Включение ротации журналов для Docker (JSON)
По умолчанию для ведения журнала на основе файла JSON ротация журналов в Docker отключена.
Это может вызвать проблему с дисковым пространством, если файлы журналов увеличиваются в размере. В нашем экземпляре Docker Ghost размер файлов журналов увеличился до 20 ГБ. Вы хотели бы избежать такой ситуации, включив ротацию журналов.
Чтобы включить ротацию журналов в Docker, отредактируйте /etc/docker/daemon.json
файл:
sudo nano /etc/docker/daemon.json
Добавьте следующие строки и сохраните файл:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Перезапустите Docker daemon:
sudo systemctl restart docker
Вышеуказанная настройка, конечно, относится к обычной установке Docker, для которой по умолчанию установлено ведение журнала в формате JSON. Поэтому обратите внимание, что каждый другой механизм ведения журнала (перечисленный ниже) имеет свой собственный способ реализации ротации.