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

Настройка ротации логов Docker: выбор logging driver, ограничение размера файлов, проверка конфигурации и применение к контейнерам.

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

В этой инструкции рассматривается только ограничение размера логов Docker и проверка применённой конфигурации.

Проверено на: Docker Engine 29.x, Ubuntu Server 24.04 LTS
Уровень сложности: начальный
Время выполнения: около 10 минут
Требуемый доступ: пользователь с правами sudo

Что будет настроено

После выполнения инструкции:

  • будет выбран logging driver;
  • будет ограничен размер логов контейнеров;
  • будет ограничено количество файлов ротации;
  • будет проверена конфигурация Docker;
  • будет показано, как применить настройки к существующим контейнерам.

Проверка текущего logging driver

Проверьте текущий драйвер:

docker info | grep 'Logging Driver'

Пример результата:

Logging Driver: json-file

Проверьте драйвер конкретного контейнера:

docker inspect   --format '{{.HostConfig.LogConfig.Type}}'   CONTAINER_NAME

Проверьте его параметры:

docker inspect   --format '{{json .HostConfig.LogConfig.Config}}'   CONTAINER_NAME

Где Docker хранит логи

Для драйвера json-file логи обычно находятся в каталоге:

/var/lib/docker/containers/

Посмотреть путь к лог-файлу контейнера:

docker inspect   --format '{{.LogPath}}'   CONTAINER_NAME

Проверить размер:

sudo du -h   "$(docker inspect --format '{{.LogPath}}' CONTAINER_NAME)"

Выбор logging driver

Для обычного сервера удобно использовать драйвер local.

Преимущества:

  • встроенная ротация;
  • более компактное хранение;
  • отсутствие неограниченного роста одного файла;
  • поддержка стандартной команды docker logs.

Проверьте доступные драйверы:

docker info | grep -A20 'Plugins:'

Настройка драйвера local

Создайте каталог конфигурации:

sudo mkdir -p /etc/docker

Создайте файл:

sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "local",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
EOF

Параметры означают:

  • max-size = 10m — максимальный размер одного файла;
  • max-file = 5 — количество файлов ротации.

Максимальный объём логов одного контейнера будет примерно:

10 МБ × 5 = 50 МБ

Проверка JSON

jq . /etc/docker/daemon.json

Если jq не установлен:

sudo apt update
sudo apt install -y jq

Проверка конфигурации Docker

sudo dockerd   --validate   --config-file=/etc/docker/daemon.json

Ожидаемый результат:

configuration OK

Перезапуск Docker

Примените конфигурацию:

sudo systemctl restart docker

Проверьте состояние:

sudo systemctl is-active docker

Проверьте драйвер:

docker info | grep 'Logging Driver'

Ожидаемый результат:

Logging Driver: local

Важная особенность применения

Настройки по умолчанию применяются только к новым контейнерам.

Уже созданные контейнеры сохраняют старую конфигурацию логирования.

Проверьте контейнер:

docker inspect   --format '{{.HostConfig.LogConfig.Type}}'   CONTAINER_NAME

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

Применение в Docker Compose

Пример:

services:
  app:
    image: nginx:alpine
    logging:
      driver: local
      options:
        max-size: "10m"
        max-file: "5"

Проверьте конфигурацию:

docker compose config

Пересоздайте контейнер:

docker compose up -d --force-recreate

Проверьте параметры:

docker inspect   --format '{{.HostConfig.LogConfig.Type}} {{json .HostConfig.LogConfig.Config}}'   CONTAINER_NAME

Настройка json-file с ротацией

Если требуется сохранить json-file:

sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
EOF

После изменения:

sudo dockerd   --validate   --config-file=/etc/docker/daemon.json

sudo systemctl restart docker

Контейнеры также потребуется пересоздать.

Проверка роста логов

Список крупнейших Docker-логов:

sudo find /var/lib/docker/containers   -type f   -name '*-json.log'   -printf '%s %p
' 2>/dev/null |
sort -nr |
head -20 |
numfmt --field=1 --to=iec

Для драйвера local используйте:

sudo du -ah /var/lib/docker/containers |
sort -h |
tail -20

Просмотр логов контейнера

Последние 100 строк:

docker logs --tail 100 CONTAINER_NAME

Наблюдение в реальном времени:

docker logs -f CONTAINER_NAME

Логи за последний час:

docker logs   --since 1h   CONTAINER_NAME

Очистка старого json-file

Если старый лог уже занял много места, сначала остановите контейнер:

docker stop CONTAINER_NAME

Очистите файл:

sudo truncate -s 0   "$(docker inspect --format '{{.LogPath}}' CONTAINER_NAME)"

Запустите контейнер:

docker start CONTAINER_NAME

Важно: не удаляйте активный лог-файл через rm, если контейнер продолжает работать.

После очистки всё равно настройте ротацию, иначе файл снова вырастет.

Проверка после пересоздания

docker inspect   --format '{{.HostConfig.LogConfig.Type}}'   CONTAINER_NAME
docker inspect   --format '{{json .HostConfig.LogConfig.Config}}'   CONTAINER_NAME

Проверьте работу логов:

docker logs --tail 20 CONTAINER_NAME

Типичные проблемы

После restart остался старый драйвер

Docker daemon использует новый драйвер только для новых контейнеров.

Пересоздайте контейнер:

docker compose up -d --force-recreate

Docker не запускается после изменения daemon.json

Проверьте JSON:

jq . /etc/docker/daemon.json

Проверьте конфигурацию:

sudo dockerd   --validate   --config-file=/etc/docker/daemon.json

Посмотрите журнал:

sudo journalctl -u docker -n 100 --no-pager

docker logs не показывает старые записи

После ротации старые записи могут находиться в архивных файлах драйвера и быть недоступны через обычный вывод в полном объёме.

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

Логи продолжают занимать много места

Проверьте:

docker inspect   --format '{{.HostConfig.LogConfig.Type}} {{json .HostConfig.LogConfig.Config}}'   CONTAINER_NAME

Убедитесь, что контейнер действительно пересоздан после изменения конфигурации.

Когда нужен внешний сбор логов

Локальная ротация подходит для защиты диска, но не заменяет централизованное хранение.

Отдельный сбор логов нужен, если требуется:

  • поиск по нескольким серверам;
  • длительное хранение;
  • уведомления;
  • аудит;
  • корреляция событий;
  • сохранение логов после удаления контейнера.

Для этого используют Loki, Elasticsearch, OpenSearch и другие системы.

Итог

После выполнения инструкции:

  • выбран logging driver Docker;
  • ограничен размер файлов;
  • настроено количество файлов ротации;
  • проверена конфигурация daemon;
  • пересозданы контейнеры;
  • проверены фактические параметры;
  • показана безопасная очистка старых логов.

Локальная ротация защищает диск от неконтролируемого роста логов, но для долгосрочного хранения требуется отдельная система логирования.

← Предыдущая статья Просмотр и очистка журналов systemd в Ubuntu Следующая статья → Базовая работа с Docker Compose