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

Где 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