Как использовать команду docker desktop logs для просмотра логов Docker Desktop

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

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

Введение

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

Это практическое руководство проведёт вас через процесс просмотра базовых логов контейнеров, а затем продемонстрирует, как фильтровать эти логи по приоритету, временному диапазону и конкретному юниту (контейнеру или сервису), который их генерирует. К концу этой лабораторной работы вы будете уверенно использовать команду docker desktop logs для получения ценной информации о ваших контейнеризированных приложениях.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container 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") subgraph Lab Skills docker/run -.-> lab-555143{{"Как использовать команду docker desktop logs для просмотра логов Docker Desktop"}} docker/stop -.-> lab-555143{{"Как использовать команду docker desktop logs для просмотра логов Docker Desktop"}} docker/rm -.-> lab-555143{{"Как использовать команду docker desktop logs для просмотра логов Docker Desktop"}} docker/logs -.-> lab-555143{{"Как использовать команду docker desktop logs для просмотра логов Docker Desktop"}} end

Просмотр базовых логов Docker Desktop

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

Сначала запустим простой контейнер, который генерирует некоторый вывод. Мы будем использовать образ hello-world — это очень маленький образ, который печатает сообщение и завершает работу.

docker run hello-world

Вы должны увидеть вывод, похожий на этот, что означает, что Docker-демон успешно загрузил образ и запустил контейнер:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f52335ce493178fc15f729218f180e9988e31c374a6ce98da40cbb890f97f10e
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To learn more, try the following commands:
 docker run -it ubuntu bash
 docker images
 docker ps
 docker stop <containerid>
 docker rm <containerid>
To get started with Docker Desktop, visit:
 https://www.docker.com/products/docker-desktop

Этот вывод представляет собой стандартный вывод (stdout) и стандартный поток ошибок (stderr) контейнера. Docker захватывает эти потоки и делает их доступными в виде логов.

Теперь запустим контейнер, который продолжает работать и генерирует логи с течением времени. Мы будем использовать образ alpine и выполним простую команду, которая печатает сообщение каждые 5 секунд.

Сначала загрузим образ alpine:

docker pull alpine

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

Using default tag: latest
latest: Pulling from library/alpine
... (output showing download progress)
Digest: sha256:...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

Теперь запустим контейнер alpine в фоновом режиме (-d) и дадим ему имя (--name mylogger) для удобства. Команда while true; do echo "Hello from mylogger at $(date)"; sleep 5; done будет выводить сообщение с текущей датой каждые 5 секунд.

docker run -d --name mylogger alpine sh -c 'while true; do echo "Hello from mylogger at $(date)"; sleep 5; done'

Эта команда выведет идентификатор контейнера.

Чтобы просмотреть логи работающего контейнера, используйте команду docker logs с указанием имени или ID контейнера.

docker logs mylogger

Вы увидите вывод, сгенерированный командой контейнера, с новой строкой примерно каждые 5 секунд. Нажмите Ctrl+C, чтобы прекратить просмотр логов.

Для просмотра логов в реальном времени используйте опцию -f (follow):

docker logs -f mylogger

Это будет непрерывно отображать новые записи логов по мере их генерации. Нажмите Ctrl+C, чтобы прекратить слежение за логами.

Наконец, остановим и удалим созданный контейнер:

docker stop mylogger
docker rm mylogger

Это освободит ресурсы контейнера.

Фильтрация логов по приоритету

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

Давайте используем контейнер alpine из предыдущего шага. Если вы его остановили и удалили, запустите снова:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

Эта команда запускает контейнер в фоновом режиме и выводит сообщения с разными префиксами приоритета (INFO, WARNING, ERROR) каждые 5 секунд.

Теперь давайте просмотрим логи, отфильтровав только строки, содержащие "ERROR". Мы можем передать вывод docker logs в grep.

docker logs mylogger | grep "ERROR"

Вы увидите только строки логов контейнера, содержащие слово "ERROR".

Аналогично для просмотра только строк с "WARNING":

docker logs mylogger | grep "WARNING"

И для строк с "INFO":

docker logs mylogger | grep "INFO"

Вы также можете комбинировать фильтры. Например, чтобы увидеть строки, содержащие либо "WARNING", либо "ERROR", используйте опцию -E с grep для расширенных регулярных выражений и оператор |:

docker logs mylogger | grep -E "WARNING|ERROR"

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

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

В завершение остановим и удалим контейнер:

docker stop mylogger
docker rm mylogger

Фильтрация логов по временному диапазону

На этом шаге вы научитесь фильтровать логи Docker-контейнеров по временному диапазону. Это полезно для анализа логов за определенный период, например, во время инцидента или конкретного развертывания.

Команда docker logs предоставляет опции для фильтрации логов по времени. Мы снова будем использовать контейнер alpine. Если он не запущен, выполните ту же команду, что и ранее:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

Дайте контейнеру поработать 1-2 минуты, чтобы сгенерировать логи.

Для просмотра логов, созданных с определенного времени, используйте опцию --since. Время можно указать в различных форматах: timestamp (секунды с эпохи Unix), относительное время (например, 10m для 10 минут, 1h для 1 часа) или строку даты/времени.

Посмотрим логи за последние 2 минуты:

docker logs --since 2m mylogger

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

Вы также можете указать начальное и конечное время с помощью --since и --until. Опция --until работает аналогично --since, позволяя указать время, до которого нужно показывать логи.

Для просмотра логов между 5 минутами назад и 1 минутой назад:

docker logs --since 5m --until 1m mylogger

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

Можно использовать конкретные timestamp. Чтобы получить текущий timestamp, используйте команду date +%s.

Получим timestamp для 1 минуты назад:

date -d "1 minute ago" +%s

Теперь используем этот timestamp с --until для просмотра логов до 1 минуты назад:

docker logs --until $(date -d "1 minute ago" +%s) mylogger

Эта команда покажет логи с момента запуска контейнера до 1 минуты назад.

Фильтрация по временному диапазону — мощный способ сузить анализ логов и сосредоточиться на релевантных событиях.

В завершение остановим и удалим контейнер:

docker stop mylogger
docker rm mylogger

Фильтрация логов по юниту (unit)

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

Основной способ фильтрации логов по юниту в Docker — указание имени или ID контейнера при использовании команды docker logs. Мы уже делали это в предыдущих шагах.

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

Сначала убедимся, что контейнер mylogger из предыдущих шагов остановлен и удален:

docker stop mylogger || true
docker rm mylogger || true

Теперь запустим первый контейнер с именем container1:

docker run -d --name container1 alpine sh -c 'while true; do echo "Container 1 log at $(date)"; sleep 3; done'

Этот контейнер будет выводить сообщение в лог каждые 3 секунды.

Затем запустим второй контейнер с именем container2:

docker run -d --name container2 alpine sh -c 'while true; do echo "Container 2 log at $(date)"; sleep 5; done'

Этот контейнер будет выводить сообщение в лог каждые 5 секунд.

Теперь, чтобы просмотреть логи только из container1, используйте:

docker logs container1

Вы увидите только сообщения, сгенерированные container1.

Для просмотра логов только из container2 используйте:

docker logs container2

Вы увидите только сообщения, сгенерированные container2.

Это демонстрирует, как docker logs по умолчанию фильтрует по указанному контейнеру (юниту). Если бы вы использовали централизованную систему логирования, собирающую логи из нескольких контейнеров, вы бы обычно использовали метаданные, связанные с каждой записью лога (например, имя или ID контейнера) для фильтрации по юниту.

Хотя сама команда docker logs не имеет отдельного флага --unit как некоторые системные инструменты логирования, базовая концепция фильтрации по источнику лога (контейнеру) достигается путем указания имени или ID контейнера.

В завершение остановим и удалим оба контейнера:

docker stop container1 container2
docker rm container1 container2

Итоги

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

На основе базового просмотра логов вы изучили расширенные опции фильтрации для эффективного управления и анализа данных логов. Вы научились фильтровать логи по уровням приоритета, что позволяет сосредоточиться на критически важных сообщениях. Кроме того, вы попрактиковались в фильтрации логов по временным диапазонам для изоляции событий в определенный период времени и по юнитам для просмотра логов конкретных сервисов или компонентов. Эти методы фильтрации необходимы для работы с большими объемами данных логов и быстрого выявления релевантной информации для устранения неполадок и анализа.