Как посмотреть логи контейнера
docker logs webКоманда показывает всё, что программа в контейнере web напечатала на экран (в стандартный вывод и вывод ошибок) с момента создания контейнера. Работает и для остановленного контейнера — так ищут причину падения.
Полезные ключи
| Задача | Команда |
|---|---|
| Последние 100 строк | docker logs --tail 100 web |
| Следить за новыми строками | docker logs -f web |
| Последние 50 строк и дальше следить | docker logs -f --tail 50 web |
| За последние 30 минут | docker logs --since 30m web |
| С отметками времени | docker logs -t web |
Выход из слежения (-f) — Ctrl+C; контейнер при этом не останавливается. В --since и --until можно писать промежуток (10m, 2h) или дату и время (2026-11-05T10:00:00).
Искать по логу — через grep. Строки, которые программа писала в поток ошибок, docker logs тоже выдаёт в поток ошибок, а grep их не видит. Поэтому оба потока сводят в один:
docker logs web 2>&1 | grep -i errorDocker Compose
В папке проекта:
docker compose logs -f
docker compose logs --tail 50 wordpressБез имени сервиса — логи всех сервисов вперемешку, каждая строка подписана именем сервиса.
Где хранятся логи
По умолчанию — в JSON-файле на хосте, по одному на контейнер. Путь показывает команда:
docker inspect --format '{{.LogPath}}' webОбычно это /var/lib/docker/containers/<идентификатор>/<идентификатор>-json.log, где <идентификатор> — полный идентификатор контейнера; читать файл можно с sudo. При удалении контейнера (docker rm) удаляется и его лог.
Без ограничения такой файл растёт бесконечно и может занять весь диск. Ограничьте размер логов в /etc/docker/daemon.json (max-size, max-file) — как это сделать, описано в уроке Обновление и очистка места. Не очищайте файлы лога вручную, пока работает Docker.
Логи пустые
- Программа пишет в файл, а не на экран. Docker видит только стандартный вывод. Такие логи ищут внутри контейнера (
docker exec web ls /var/log) или подключают папку с ними томом. Официальные образы обычно уже настроены выводить логи на экран. - Python держит вывод в буфере. Строки из
print()появляются с задержкой или после завершения программы. Задайте в DockerfileENV PYTHONUNBUFFERED=1или запускайтеpython -u. - Контейнер пересоздан. Лог принадлежит контейнеру: после
docker rmи новогоdocker run(или обновления через Compose) старые строки пропадают. Нужна долгая история — настройте отправку логов в отдельную систему или пусть программа пишет свой журнал в том.
Логи самого Docker
Если не запускается сам Docker или контейнер не создаётся вовсе, смотрите журнал службы:
sudo journalctl -u docker --no-pager -n 50