Журнали контейнерів Docker займають весь мій простір на диску


78

Я запускаю контейнер на віртуальній машині. Мій контейнер за замовчуванням записує журнали у файл /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log, поки диск не заповниться.

В даний час я повинен видалити цей файл вручну, щоб уникнути заповнення диска. Я читав, що в Docker 1.8 буде параметр для обертання журналів . Що б ви рекомендували як поточне рішення?


2
Як поточне рішення, ви можете повністю вимкнути журнали, якщо це для вас не важливо. Це можна зробити, запустивши демон Docker з --log-driver=none. Якщо ви хочете вимкнути журнали лише для певних контейнерів, ви можете запустити їх за --log-driver=noneдопомогою docker runкоманди. Іншим варіантом може бути підключення зовнішнього сховища до /var/lib/docker. Як спільний ресурс NFS або щось, що має більше ємності, ніж хост, про який йде мова.
Дхарміт,

2
Або скористайтеся journaldдрайвером журналу, і нехай журналд турбується про обертання журналу.
larsks

@Dharmit де він знаходиться на CoreOs?
poiuytrez

@larsks Як я можу це зробити на CoreOS? Здається, що журнал встановлений і генерує журнали в / var / log / journal, але у мене також є журнали в
/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log

1
@poiuytrez де що знаходиться? Якщо ви бажаєте запустити демон Docker із запропонованою опцією, /usr/lib/systemd/system/docker.serviceможливо, це файл. Я не впевнений у CoreOS. На CentOS це місце. Що стосується іншого питання, вам потрібно змінити параметри демона Docker для використання journaldв якості драйвера реєстрації. Тоді він буде реєструвати контейнери за допомогою journald, а не входити /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log. @larsks виправляє мене, якщо мені чогось не вистачає.
Дхарміт,

Відповіді:


85

Випущено Docker 1.8 з можливістю обертання журналу. Додавання:

--log-opt max-size=50m 

при запуску контейнера це робить трюк. Ви можете дізнатися більше за адресою: https://docs.docker.com/engine/admin/logging/overview/


Зазначимо, це, здається, доступно лише для журналів JSON та вільних журналів.
dman

5
Лише коротке зауваження, що схема версій змінилася після Docker 1.13. Якщо у вас є такий номер версії, 17.03.0-ceце означає, що ви перебуваєте на новій схемі версій після 1.13.
триплеє

Просто знання того, що докер робить обертання журналу, є корисним фактом
icc97

41

ПОПЕРЕДЖЕННЯ. Це призначено лише для версії 2 для компонування докерів

Приклад:

version: '2'
services:
  db:
    container_name: db
    image: mysql:5.7
    ports:
      - 3306:3306
    logging:
      options:
        max-size: 50m

3
Перезапуск мого сервісу за допомогою цього розділу ведення журналу працює, але, здається, це не має ефекту, файл журналу json просто продовжує зростати, як раніше ...
dokaspar


9

Увага: ця публікація стосується версій docker <1.8 (які не мають --log-optопції)

Чому б вам не використовувати logrotate (який також підтримує стиснення)?

/var/lib/docker/containers/*/*-json.log {
hourly
rotate 48
compress
dateext
copytruncate
}

Налаштуйте його безпосередньо на вашому CoreOs Node або розгорніть контейнер (наприклад, https://github.com/tutumcloud/logrotate ), який монтує / var / lib / docker для обертання журналів.


7
Я не думаю, що це хороше рішення. Вам потрібно відхилити будь-який запущений демон, щоб припинити запис у старий журнал і почати запис у новий журнал. В іншому випадку ядро ​​Linux продовжить посилатися на старий файл журналу в пам'яті (на відміну від диска). Logrotate може робити це за допомогою звичайних демонів, але відскок докера або контейнера призводить до простою.
dman

1
Гарна думка, я згоден. Ця відповідь була надана в перші дні Docker (tm), в той час як вбудовані функції (як згадано в іншій відповіді) повинні виконати цю роботу.
gtonic

У цього є деякі проблеми, він обертає журнали, але споживання диска все одно показує схоже. Я використовував v5.0.2, а потім повинен був оновити його до останнього за допомогою скрипта get.docker.com, щоб використовувати параметр --log-opt з командою docker create or run.
v_sukt

5

Передавати параметри журналу під час запуску контейнера. Прикладом може бути такий

sudo docker run -ti --name visruth-cv-container  --log-opt max-size=5m --log-opt max-file=10 ubuntu /bin/bash

де --log-opt max-size=5mвказує максимальний розмір файлу журналу 5 МБ і --log-opt max-file=10вказує максимальну кількість файлів для обертання.


5

[Ця відповідь охоплює поточні версії docker для тих, хто стикається із запитанням довгий час після його запитання.]

Щоб встановити обмеження журналу за замовчуванням для всіх новостворених контейнерів, ви можете додати наступне в /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

Потім перезавантажте Docker, systemctl reload dockerякщо ви використовуєте systemd (інакше використовуйте відповідну команду перезапуску для встановлення).

Ви також можете переключитися на локальний драйвер журналювання з подібним файлом:

{
  "log-driver": "local",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

Локальний драйвер ведення журналу зберігає вміст журналу у внутрішньому форматі (я вважаю protobufs), тому ви отримаєте більше вмісту журналу у файлі журналу однакового розміру (або займете менше місця у файлі для тих самих журналів). Недоліком локального драйвера є зовнішні інструменти, такі як пересилання журналів, які не можуть проаналізувати необроблені журнали. Майте в виду , що docker logsпрацює тільки тоді , коли водій журналу встановлено json-file, localабо journald.

Це max-sizeобмеження для файлу журналу docker, тому воно включає накладні витрати на форматування json або локального журналу. І max-fileце кількість журналів, які буде підтримувати докер. Після досягнення обмеження розміру для одного файлу журнали обертаються, а найстаріші журнали видаляються, коли ви перевищуєте max-file.

Щоб отримати докладнішу інформацію, docker має документацію щодо всіх драйверів за адресою: https://docs.docker.com/config/containers/logging/configure/

У мене також є презентація, що висвітлює цю тему. Використовуйте, Pщоб переглянути примітки ведучого: https://sudo-bmitch.github.io/presentations/dc2019/tips-and-tricks-of-the-captains.html#logs


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.