Docker logs: посмотреть и ограничить размер логов

Категория: docker · Язык: Bash · Обновлено:

Логи контейнера показывает команда docker logs имя. Ключ -f следит за выводом в реальном времени, --tail 100 показывает последние 100 строк, а --since 10m строки за последние десять минут. Размер журналов по умолчанию не ограничен, поэтому настройте ротацию.

Основные команды

Bash
docker logs my-app                    # весь вывод контейнера
docker logs -f my-app                 # следить в реальном времени (выход Ctrl+C)
docker logs --tail 100 my-app         # последние 100 строк
docker logs -f --tail 20 my-app       # последние 20 строк и далее в реальном времени
docker logs --since 10m my-app        # за последние 10 минут
docker logs -t my-app                 # с метками времени

Для периода можно задать точные даты: docker logs --since 2026-10-25T10:00:00 --until 2026-10-25T11:00:00 my-app.

Фильтрация вывода

docker logs воспроизводит потоки stdout и stderr контейнера отдельно. Чтобы искать по обоим потокам, объедините их:

Bash
docker logs my-app 2>&1 | grep -i error
docker logs --since 1h my-app 2>&1 | grep -c "ERROR"

Логи Docker Compose

Bash
docker compose logs                   # все сервисы
docker compose logs -f --tail 50 web  # один сервис, живой вывод
docker compose logs --since 30m       # за последние 30 минут

Где хранятся файлы логов

Bash
docker inspect --format '{{.LogPath}}' my-app

Команда выводит путь к файлу на хосте, обычно /var/lib/docker/containers/<id>/<id>-json.log. Чтобы очистить файл без остановки контейнера:

Bash
truncate -s 0 "$(docker inspect --format '{{.LogPath}}' my-app)"

Ограничить размер логов

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

Для одного контейнера:

Bash
docker run -d --name my-app --log-opt max-size=10m --log-opt max-file=3 nginx:alpine

Для всех контейнеров, в файле /etc/docker/daemon.json:

Текст
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

После правки перезапустите службу Docker: sudo systemctl restart docker. Настройки применяются только к новым контейнерам, существующие нужно пересоздать.

В файле Docker Compose:

YAML
services:
  web:
    image: nginx:alpine
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Значения означают: файл вращается при достижении 10 МБ, хранится не более трёх файлов, то есть не больше 30 МБ на контейнер.

Частые вопросы

Почему docker logs пустой?

Приложение пишет логи в файл внутри контейнера, а не в stdout и stderr. В Docker принято писать в стандартные потоки. Для nginx и других программ это делают ссылки /var/log/nginx/access.log на /dev/stdout.

Как посмотреть логи остановленного контейнера?

Команда docker logs работает и для остановленных контейнеров, пока они не удалены (docker rm).

Почему не работает docker logs с драйвером journald или syslog?

Для некоторых драйверов чтение через docker logs не поддерживается: смотрите логи средствами самой системы, например journalctl CONTAINER_NAME=my-app.