Кратко в 3 пунктах
- Логи консоли контейнеров Docker хранятся в файлах на диске хоста, а не в системной памяти.
- Команда
docker logsсчитывает и отображает содержимое этих сохраненных файлов.- Чтобы предотвратить бесконечный рост файлов логов, крайне важно настроить параметры ротации логов (
max-size,max-file).
1. Где и как хранятся логи?
Docker собирает как стандартный вывод (stdout), так и стандартную ошибку (stderr) контейнеров и обрабатывает их через драйвер логирования (Logging Driver). Если специальные настройки не заданы, Docker по умолчанию использует драйвер логирования json-file.
- Место хранения: Логи контейнеров сохраняются в виде JSON-файлов по определенному пути в файловой системе хост-системы. Обычно путь выглядит так:
/var/lib/docker/containers/[컨테이너_ID]/[컨тей너_ID]-json.log
- Команда
docker logs: Эта команда на самом деле не отображает содержимое из памяти, а считывает вышеупомянутые JSON-файлы логов и выводит их в терминал.

2. Разве постоянное накопление логов не приводит к нехватке дискового пространства?
Да, это так. Если не принять меры, файлы логов будут постоянно расти и могут занять все дисковое пространство хоста. Чтобы предотвратить это, 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: Ограничивает максимальный размер одного файла лога 10 МБ.--log-opt max-file=3: Ограничивает максимальное количество файлов логов 3 штуками. Если их становится больше 3, самый старый файл удаляется.
Таким образом, логи этого контейнера будут занимать не более 30 МБ (10 МБ * 3 файла) дискового пространства.
3. Настройка в файле docker-compose.yml
В Docker Compose очень легко настроить параметры логирования для каждой службы прямо в файле docker-compose.yml.
Представьте, что флаг --log-opt команды docker run просто переносится в формат YAML.
Ниже приведен пример применения ротации логов для службы под названием my-app.
services:
my-app:
image: your-app-image
# ... другие настройки ...
deploy:
resources:
limits:
memory: 512M
# 👇 Эта часть относится к настройкам логирования.
logging:
driver: "json-file" # Используемый драйвер логирования (можно опустить, так как это значение по умолчанию)
options:
max-size: "10m" # Максимальный размер файла: 10 МБ
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 будут автоматически ротироваться, занимая не более 30 МБ (10 МБ * 3 файла) дискового пространства.
4. Установка по умолчанию для всех контейнеров
Если вам неудобно задавать опции для каждого контейнера по отдельности и вы хотите применить политику по умолчанию ко всей системе, лучше всего изменить файл настроек демона Docker (Daemon).
- Откройте или создайте файл
/etc/docker/daemon.json. (Если файла нет, создайте его.) - Добавьте следующее содержимое:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- Перезапустите демон Docker.
sudo systemctl restart docker
После этой настройки все контейнеры, создаваемые в будущем, будут автоматически следовать этой политике, если для них не заданы отдельные параметры логирования. Конечно, если вы укажете другие параметры логирования для конкретного контейнера в файле docker-compose.yml или с помощью команды docker run, то индивидуальные настройки будут иметь приоритет над настройками демона.
- Настройки для отдельных служб: Наиболее распространенный и удобный способ — это настройка в секции
loggingфайлаdocker-compose.yml. - Глобальные настройки по умолчанию: Чтобы применить единую политику ко всем контейнерам на сервере, измените файл
/etc/docker/daemon.json.