Где Docker хранит файлы журналов?
Отладка большинства программ Linux обычно включает проверку файлов журналов, что может быть сложным процессом. Однако при работе в контейнерной среде под Docker вам потребуется использовать более специфические инструменты для отладки приложений в рабочей среде.
Где хранятся журналы?
Простой ответ заключается в том, что Docker хранит журналы контейнеров в своем основном хранилище, /var/lib/docker/
. У каждого контейнера есть журнал, относящийся к его идентификатору (полный идентификатор, а не сокращенный, который обычно отображается), и вы можете получить к нему доступ следующим образом:
/var/lib/docker/containers/ID/ID-json.log
Вот где они хранятся, но поскольку они в формате JSON, их нелегко прочитать, а необходимость использовать полный идентификатор контейнера раздражает. Docker предоставляет встроенную команду для их просмотра:
docker logs -f e4bd48ef3103
Здесь флаг -f
оставит приглашение открытым и будет «следить» за любыми новыми записями в файле. Вы также можете --tail
файла или использовать --timestamps
для отображения времени журнала или использовать --until
и --since
для фильтрации по времени.
Если вы используете Docker Compose, вы можете использовать команду журнала, чтобы легко просмотреть все журналы:
docker-compose logs
Однако одна вещь, которую вы заметите, это то, что это STDOUT и STDERR, которые полезны для многих вещей, но показывают только консольный вывод точки входа, указанной «CMD» в файле Docker. Многие приложения имеют свои собственные специальные системы ведения журналов, которые часто регистрируются в таких файлах, как /var/log/nginx/access.log
. Доступ к таким журналам по-прежнему возможен со стороны хоста через Docker.
Просмотр журналов из приложений внутри контейнеров
В зависимости от контейнера в этом может не быть необходимости. Например, контейнер NGINX по умолчанию настроен на отправку журналов Docker в STDOUT, чтобы упростить проверку журналов. Он делает это с помощью символической ссылки из /dev/stdout
на файл журнала, и вы можете настроить что-то подобное для своих контейнеров.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Но если вы хотите извлечь определенные файлы внутри контейнера, вы можете это сделать. Docker предоставляет команду exec -it
, позволяющую запускать любую команду внутри любого запущенного процесса Docker. Используя это, вы можете сохранить файл журнала внутри контейнера Docker:
docker exec -it e4bd48ef3103 tail -f log.txt
Поскольку это позволяет вам запускать любую команду, вы можете использовать journalctl
или любые другие стратегии отладки, которые вы хотите, до тех пор, пока вы предваряете их docker exec -it
. Вы даже можете запустить /bin/bash
, если хотите зайти и покопаться.
Более постоянное решение, которое лучше работает с хост-сервисами, — это использование монтирования тома Docker. Вы можете привязать каталог, например /var/log/nginx
, к тому, который виден с хоста. Сначала создайте новый том:
docker volume create nginx-logs
И запустите контейнер с параметром --mount
:
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Если вы используете Docker Compose, процесс можно автоматизировать:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
Таким образом, файлы журналов будут напрямую приниматься любыми службами агрегирования журналов на хост-компьютере.
Просмотр журналов демона Docker
Если вместо этого вы хотите просмотреть журналы, относящиеся к службе Docker в целом на вашем сервере, а не к какому-либо конкретному контейнерному приложению, вам нужно просмотреть журналы journalctl
:
sudo journalctl -fu docker.service
Здесь он хранится в большинстве систем, но в некоторых он находится в другом месте:
- Amazon Linux:
/var/log/docker
- CentOS/RHEL:
/var/log/messages | докер grep
- macOS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows:
AppDataRoamingDockerlogvmdockerd.log