Docker предоставляет гибкий способ управления приложениями с помощью контейнеров. Однако бывают ситуации, когда логи контейнеров могут быстро расти в размере и заполнять дисковое пространство, что может привести к различным проблемам, включая снижение производительности и отказ в обслуживании. Рассмотрим, как ограничить размер логов Docker, чтобы избежать этих проблем.
Основные механизмы управления логами
Docker предоставляет несколько механизмов для управления логами:
- Ограничение размера файлов логов.
- Ротация логов.
- Использование различных драйверов логирования.
Ограничение размера файлов логов
В Docker можно задать максимальный размер файлов логов и количество файлов логов (ротация), которые нужно хранить.
Настройка лимитов
Настройки лимитов логов можно задать в файле daemon.json
, который обычно находится в/etc/docker/daemon.json
.
Создайте файл, если его нет в системе.
Пример файла:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
В этом примере:
"log-driver": "json-file"
указывает, что используется драйвер логирования json-file."max-size": "10m"
устанавливает максимальный размер одного файла лога на 10 мегабайт."max-file": "3"
указывает, что нужно хранить не более трёх файлов логов.
После внесения изменений в файл daemon.json
, нужно перезапустить Docker демон:
sudo systemctl restart docker
Лимиты при запуске контейнера
Можно задать лимиты логов при использовании docker compose, добавив соответствующие опции в файл docker-compose.yml
services:
my-service:
image: my-image
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Также можно задать лимиты логов, используя опции командной строки:
docker run --log-opt max-size=10m --log-opt max-file=3 my-container
В этом примере:
--log-opt max-size=10m
устанавливает максимальный размер одного файла лога на 10 мегабайт.--log-opt max-file=3
указывает, что нужно хранить не более трёх файлов логов.
Использование различных драйверов логирования
Docker поддерживает несколько драйверов логирования:
- json-file (по умолчанию): Логи сохраняются в JSON файлы.
- local: Захватывает выходные данные из stdout/stderr контейнера и записывает их в локальный файл.
- journald: Логи отправляются в системный журнал
journald
. - syslog: Логи отправляются в системный журнал
syslog
. - gelf: Логи отправляются в Graylog Extended Log Format (GELF).
- fluentd: Логи отправляются в Fluentd.
- awslogs: Логи отправляются в Amazon CloudWatch.
- splunk: Логи отправляются в Splunk.
- gcplogs: Логи отправляются в Google Cloud Platform (GCP) Logging.
- etwlogs: Логи отправляются в ETW (только для Windows).
- none: Логи отключены.
Выбор драйвера зависит от конкретных потребностей и инфраструктуры. Например, для централизованного сбора логов часто используют fluentd
или splunk
.
Пример настройки драйвера fluentd
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "fluentdhost:24224"
}
}
services:
my-service:
image: my-image
logging:
driver: "fluentd"
options:
fluentd-address: "fluentdhost:24224"
docker run --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224 my-container
Пример настройки драйвера journald
{
"log-driver": "journald"
}
services:
my-service:
image: my-image
logging:
driver: "journald"
docker run --log-driver=journald my-container
Пример настройки драйвера syslog
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://1.2.3.4:1111"
}
}
services:
my-service:
image: my-image
logging:
driver: "syslog"
options:
syslog-address: "udp://1.2.3.4:1111"
docker run \
--log-driver syslog --log-opt syslog-address=udp://1.2.3.4:1111 \
my-container
Ротация логов с помощью logrotate
Ротация логов позволяет автоматически заменять старые файлы логов новыми, когда достигается определённый размер или истекает определённый период времени. Это помогает контролировать использование дискового пространства и избегать накопления слишком большого количества логов.
Помимо ротации логов через настройки в daemon.json
, можно использовать системные утилиты, такие как logrotate
, для управления логами на уровне операционной системы.
Создайте файл конфигурации для logrotate
, например /etc/logrotate.d/docker-containers
:
/var/lib/docker/containers/*/*.log {
rotate 5
daily
compress
delaycompress
missingok
notifempty
copytruncate
}
В этом примере:
- Ежедневная ротация логов (
daily
). - Хранятся пять ротаций логов (
rotate 5
). - Логи сжимаются после ротации (
compress
). - Отложенное сжатие (
delaycompress
) позволяет избежать проблем с доступом к свежим логам. - Игнорируются отсутствующие файлы (
missingok
). - Пустые файлы не ротируются (
notifempty
). - Используется метод
copytruncate
, чтобы избежать перезапуска контейнеров при ротации логов.
Заключение
Управление логами Docker — важная часть эксплуатации контейнеризированных приложений. Ограничение размера логов позволяет избежать проблем с дисковым пространством и обеспечить стабильную работу системы. Используя возможности Docker по лимитированию размера логов, выбору драйверов логирования и ротации логов, можно эффективно управлять логами и поддерживать систему в хорошем состоянии. Настройки можно задавать как глобально через daemon.json
, так и при запуске отдельных контейнеров или через docker compose, что позволяет гибко подходить к управлению логами в зависимости от конкретных задач и требований.