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).
-
Откройте или создайте файл
/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.
Комментариев нет.