docker logs не сохраняет логи в системной памяти. Вместо этого они по умолчанию хранятся в виде файлов на диске хостовой системы.


Где и как хранятся логи? ⚙️



Docker захватывает стандартный вывод (stdout) и стандартный поток ошибок (stderr) контейнера и обрабатывает их через драйвер логирования (Logging Driver). Если не заданы специальные настройки, Docker по умолчанию использует драйвер логирования json-file.

  • Место хранения: Логи контейнера хранятся в формате JSON в определенном пути на хост-системе. Обычно этот путь выглядит следующим образом:

    • /var/lib/docker/containers/[ID_контейнера]/[ID_контейнера]-json.log
  • Команда docker logs: Эта команда не показывает содержимое, находящееся в памяти, а читает файл JSON логов, упомянутый выше, и отображает его в терминале.


Разве постоянное накопление логов не приведет к нехватке дискового пространства? 🤔

Да, это так. Если не предпринимать никаких действий, файлы логов будут продолжать расти и могут вывести хост из строя, заняв все дисковое пространство. Чтобы избежать этого, Docker предлагает опцию ротации логов (Log Rotation), которая ограничивает размер и количество файлов логов.

Например, при выполнении команды docker run вы можете добавить следующие параметры:

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
  • --log-opt max-size=10m: Ограничивает максимальный размер одного файла логов до 10MB.

  • --log-opt max-file=3: Ограничивает максимальное количество файлов логов до 3. Если их больше, самые старые файлы будут удалены.

С такими настройками логи данного контейнера будут использовать максимум 30MB (10MB * 3) дискового пространства.


Заключение 📝



  • Консольные логи контейнера Docker хранятся в файле на диске хоста, а не в системной памяти.

  • Команда docker logs читает и отображает эти сохраняемые файлы.

  • Очень важно устанавливать опции ротации логов (max-size, max-file), чтобы предотвратить бесконечный рост файлов логов.

В Docker Compose вы можете легко настроить параметры логирования для каждой службы в файле docker-compose.yml.

Можно считать, что флаг --log-opt команды docker run записывается в формате YAML.


Настройка в файле docker-compose.yml 📝

Ниже приведен пример применения ротации логов для службы с именем my-app.

services:
  my-app:
    image: your-app-image
    # ... другие настройки ...
    deploy:
      resources:
        limits:
          memory: 512M

    # 👇 Эта часть — настройки логов.
    logging:
      driver: "json-file"  # используемый драйвер логирования (можно опустить, так как это значение по умолчанию)
      options:
        max-size: "10m"    # максимальный размер файла: 10MB
        max-file: "3"      # максимальное количество файлов: 3
  • logging: Ключ, который начинает настройки логирования для данной службы.

  • driver: Указывает используемый драйвер логирования. json-file — значение по умолчанию.

  • options: Устанавливает параметры, передаваемые драйверу.

    • max-size: То же самое, что и --log-opt max-size в docker run.

    • max-file: То же самое, что и --log-opt max-file в docker run.

Теперь, когда вы запустите эту службу с помощью docker-compose up, логи контейнера my-app будут автоматически ротироваться и использовать максимум 30MB (10MB * 3) дискового пространства.


Настройка по умолчанию для всех контейнеров 🌍

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

  1. Откройте или создайте файл /etc/docker/daemon.json. (Если файла нет, создайте его.)

  2. Напишите в нем следующее:

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}
  1. Перезапустите демон Docker.
sudo systemctl restart docker

С такими настройками все новые контейнеры будут автоматически следовать этой политике, если для них не будет задано отдельное логирование. Конечно, если в файле docker-compose.yml или в команде docker run для конкретного контейнера указаны другие параметры логирования, то индивидуальные настройки будут иметь приоритет перед параметрами демона.

Итоги

  • Настройка отдельных служб: Настройка в разделе logging файла docker-compose.yml является самой распространенной и удобной.

  • Глобальные настройки по умолчанию: Чтобы применить единое правило ко всем контейнерам сервера, измените файл /etc/docker/daemon.json.