Ограничение размера логов 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;
- пересозданы контейнеры;
- проверены фактические параметры;
- показана безопасная очистка старых логов.
Локальная ротация защищает диск от неконтролируемого роста логов, но для долгосрочного хранения требуется отдельная система логирования.