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

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

Docker предоставляет гибкий способ управления приложениями с помощью контейнеров. Однако бывают ситуации, когда логи контейнеров могут быстро расти в размере и заполнять дисковое пространство, что может привести к различным проблемам, включая снижение производительности и отказ в обслуживании. Рассмотрим, как ограничить размер логов Docker, чтобы избежать этих проблем.

Основные механизмы управления логами

Docker предоставляет несколько механизмов для управления логами:

  1. Ограничение размера файлов логов.
  2. Ротация логов.
  3. Использование различных драйверов логирования.

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

В 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 поддерживает несколько драйверов логирования:

  1. json-file (по умолчанию): Логи сохраняются в JSON файлы.
  2. local: Захватывает выходные данные из stdout/stderr контейнера и записывает их в локальный файл.
  3. journald: Логи отправляются в системный журнал journald.
  4. syslog: Логи отправляются в системный журнал syslog.
  5. gelf: Логи отправляются в Graylog Extended Log Format (GELF).
  6. fluentd: Логи отправляются в Fluentd.
  7. awslogs: Логи отправляются в Amazon CloudWatch.
  8. splunk: Логи отправляются в Splunk.
  9. gcplogs: Логи отправляются в Google Cloud Platform (GCP) Logging.
  10. etwlogs: Логи отправляются в ETW (только для Windows).
  11. 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, что позволяет гибко подходить к управлению логами в зависимости от конкретных задач и требований.

Обновлено Aug 04, 2024 01:17 MSK
Копирование материалов сайта возможно только с указанием ссылки на первоисточник.