Как использовать команду docker container logs для просмотра вывода контейнера

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Далее вы узнаете, как улучшить вывод логов, включая временные метки и детальную информацию. В завершение мы рассмотрим фильтрацию логов по времени, что позволит вам просматривать логи с определённого момента или "подхватывать" вывод в реальном времени, а также как просматривать логи до конкретного времени. Эта лабораторная работа предоставит практический опыт работы с основными техниками логирования в Docker для мониторинга и отладки ваших контейнеризированных приложений.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555112{{"Как использовать команду docker container logs для просмотра вывода контейнера"}} docker/stop -.-> lab-555112{{"Как использовать команду docker container logs для просмотра вывода контейнера"}} docker/rm -.-> lab-555112{{"Как использовать команду docker container logs для просмотра вывода контейнера"}} docker/logs -.-> lab-555112{{"Как использовать команду docker container logs для просмотра вывода контейнера"}} docker/pull -.-> lab-555112{{"Как использовать команду docker container logs для просмотра вывода контейнера"}} end

Запуск контейнера, генерирующего логи

На этом шаге мы научимся запускать Docker-контейнер, который создаёт логи. Логи необходимы для отладки и мониторинга приложений, работающих внутри контейнеров. Для этой цели мы будем использовать простой образ hello-world, так как он выводит сообщение и завершает работу, что является хорошей отправной точкой для знакомства с базовым логированием контейнеров.

Сначала загрузим образ hello-world из Docker Hub. Это гарантирует, что образ будет доступен локально перед запуском контейнера.

docker pull hello-world

Вы должны увидеть вывод, указывающий на загрузку образа.

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Теперь запустим контейнер с использованием образа hello-world. Команда docker run создаёт и запускает новый контейнер. По умолчанию Docker захватывает стандартный вывод (stdout) и стандартный поток ошибок (stderr) процесса контейнера и сохраняет их как логи.

docker run hello-world

При выполнении этой команды контейнер hello-world запустится, выведет сообщение в ваш терминал и завершит работу. Это сообщение является выводом, который Docker сохраняет как логи.

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Хотя вывод простого контейнера, такого как hello-world, отображается непосредственно в терминале, для контейнеров, работающих в фоновом режиме, или более сложных приложений потребуется использовать команду docker logs для просмотра их вывода. Мы изучим команду docker logs в следующих шагах.

Просмотр базовых логов контейнера

На предыдущем шаге мы запустили контейнер hello-world, который вывел сообщение в консоль и завершил работу. Хотя это было полезно для быстрой демонстрации, реальные приложения часто работают непрерывно в фоновом режиме. Для просмотра вывода (логов) таких контейнеров мы используем команду docker logs.

Сначала запустим контейнер, который продолжает работать и генерировать вывод. Мы будем использовать простой образ ubuntu и выполним команду, которая выводит сообщение каждые несколько секунд. Запустим этот контейнер в detached-режиме (-d), чтобы он работал в фоне. Также присвоим ему имя (my-logging-container) для удобства идентификации.

docker pull ubuntu
docker run -d --name my-logging-container ubuntu /bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done'

Команда docker pull ubuntu загружает образ Ubuntu. Команда docker run запускает новый контейнер с именем my-logging-container в detached-режиме. Внутри контейнера выполняется команда /bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done' — простой shell-скрипт, который выводит сообщение с текущей датой и временем каждые 5 секунд.

В консоли вы увидите идентификатор контейнера, что означает его успешный запуск в фоновом режиме.

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
sha256:...

Теперь, когда наш контейнер работает и генерирует логи, мы можем просмотреть их с помощью команды docker logs, указав имя или ID контейнера.

docker logs my-logging-container

Эта команда отобразит все логи, сгенерированные контейнером my-logging-container с момента его запуска. Вы увидите серию сообщений "Hello from the container..." с временными метками.

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
...

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

Просмотр логов с временными метками и дополнительными деталями

На предыдущем шаге мы рассмотрели базовые логи работающего контейнера. Хотя сам вывод полезен, он часто не содержит контекста, например, времени генерации каждой записи. Docker предоставляет опции для включения временных меток и других деталей в логи.

Для просмотра логов с временными метками мы можем использовать флаг -t или --timestamps с командой docker logs. Это добавит временную метку к каждой записи лога, показывая, когда она была записана в стандартный вывод или стандартный поток ошибок контейнера.

Давайте посмотрим логи нашего контейнера my-logging-container с временными метками:

docker logs -t my-logging-container

Теперь вы увидите логи с временной меткой в начале каждой строки. Метки представлены в формате RFC3339Nano (например, 2023-10-27T10:30:00.123456789Z).

2023-10-27T10:30:00.123456789Z Hello from the container at ...
2023-10-27T10:30:05.123456789Z Hello from the container at ...
2023-10-27T10:30:10.123456789Z Hello from the container at ...
...

Включение временных меток критически важно для анализа логов, особенно при попытке понять последовательность событий или определить момент возникновения конкретной проблемы.

Еще одна полезная опция - флаг -f или --follow, который позволяет потоково выводить логи в реальном времени. Это аналогично использованию команды tail -f для лог-файла. Попробуем это с нашим контейнером:

docker logs -f my-logging-container

Эта команда выведет существующие логи и продолжит показывать новые записи по мере их генерации контейнером. Вы увидите новые сообщения "Hello from the container..." каждые 5 секунд.

Для остановки потокового вывода нажмите Ctrl+C.

Комбинация флагов -t и -f - распространенная практика для мониторинга логов контейнера в реальном времени с временными метками:

docker logs -tf my-logging-container

Это обеспечивает живое отображение вывода контейнера, упрощая наблюдение за его поведением и отладку проблем по мере их возникновения.

Просмотр логов с определенного времени или вывод последних записей

На этом шаге мы рассмотрим, как просматривать логи контейнера, сгенерированные после определенного времени, или выводить только самые последние записи. Это особенно полезно при работе с контейнерами, которые работают длительное время и создали большой объем логов.

Для просмотра логов, сгенерированных с определенного времени, можно использовать флаг --since. Значение для --since может быть временной меткой (как те, что мы видели с флагом -t) или относительным временным интервалом (например, 10m для 10 минут, 1h для 1 часа).

Давайте подождем несколько секунд, чтобы наш контейнер my-logging-container сгенерировал дополнительные логи, а затем посмотрим записи за последние 30 секунд:

sleep 30
docker logs --since 30s my-logging-container

Эта команда выведет только записи логов, сгенерированные за последние 30 секунд. Вывод будет аналогичен полным логам, но содержать только последние записи.

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
... (только логи за последние 30 секунд)

Еще одна распространенная задача - просмотр только последних строк логов, аналогично использованию команды tail. Это можно сделать с помощью флага --tail, за которым следует количество строк для вывода.

Посмотрим последние 5 строк логов нашего контейнера:

docker logs --tail 5 my-logging-container

Эта команда выведет только 5 последних записей логов контейнера.

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ... (последние 5 строк)

Можно комбинировать --since и --tail с другими флагами, такими как -t и -f, для получения более специфичного представления логов контейнера. Например, для просмотра последних 10 строк с временными метками:

docker logs -t --tail 10 my-logging-container

Эти опции предоставляют мощные способы фильтрации и просмотра логов контейнера, упрощая быстрый поиск нужной информации.

Просмотр логов до определенного времени

Помимо просмотра логов с определенного момента времени, вы также можете просматривать логи, сгенерированные до конкретного времени, используя флаг --until. Это полезно для анализа логов до определенного момента, например, до возникновения проблемы.

Значение для --until также может быть временной меткой или относительным временным интервалом.

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

sleep 10

Теперь посмотрим логи нашего контейнера my-logging-container, сгенерированные до 10 секунд назад.

docker logs --until 10s my-logging-container

Эта команда выведет все записи логов с момента запуска контейнера до примерно 10 секунд перед выполнением команды. Вы увидите начальные записи логов, но самые свежие будут исключены.

Hello from the container at ...
Hello from the container at ...
... (логи до 10 секунд назад)

Вы можете комбинировать --since и --until для просмотра логов в определенном временном диапазоне. Например, чтобы просмотреть логи, сгенерированные между 2 минутами назад и 30 секундами назад:

docker logs --since 2m --until 30s my-logging-container

Эта команда покажет только записи логов, попадающие в указанный временной интервал.

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

docker stop my-logging-container
docker rm my-logging-container

Команда docker stop отправляет сигнал остановки контейнеру, а docker rm удаляет контейнер.

Понимание того, как фильтровать логи по времени, является важным навыком для отладки и анализа поведения ваших Docker-контейнеров.

Итоги

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

Затем мы рассмотрели базовое использование docker logs для получения вывода контейнера. Мы также научились улучшать вывод логов, включая временные метки и подробную информацию, а также фильтровать логи по времени - просматривать логи с определенного момента или до определенного времени, и как выводить последние записи логов в реальном времени.