
Ограничение размера логов Docker
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Лимиты при запуске контейнера
В этом примере:
--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
{{< tabs >}} {{< tab "daemon.json" >}}
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "fluentdhost:24224"
}
}{{< /tab >}} {{< tab "compose" >}}
services:
my-service:
image: my-image
logging:
driver: "fluentd"
options:
fluentd-address: "fluentdhost:24224"{{< /tab >}} {{< tab "docker" >}}
docker run --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224 my-container{{< /tab >}} {{< /tabs >}}
Пример настройки драйвера journald
{{< tabs >}} {{< tab "daemon.json" >}}
{
"log-driver": "journald"
}{{< /tab >}} {{< tab "compose" >}}
services:
my-service:
image: my-image
logging:
driver: "journald"{{< /tab >}} {{< tab "docker" >}}
docker run --log-driver=journald my-container{{< /tab >}} {{< /tabs >}}
Пример настройки драйвера syslog
{{< tabs >}} {{< tab "daemon.json" >}}
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://1.2.3.4:1111"
}
}{{< /tab >}} {{< tab "compose" >}}
services:
my-service:
image: my-image
logging:
driver: "syslog"
options:
syslog-address: "udp://1.2.3.4:1111"{{< /tab >}} {{< tab "docker" >}}
docker run \
--log-driver syslog --log-opt syslog-address=udp://1.2.3.4:1111 \
my-container{{< /tab >}} {{< /tabs >}}
Ротация логов с помощью 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, что позволяет гибко подходить к управлению логами в зависимости от конкретных задач и требований.


