Docker-Containerprotokolle belegen meinen gesamten Speicherplatz

76

Ich führe einen Container auf einer VM aus. Mein Container schreibt standardmäßig Protokolle in die Datei /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log, bis der Datenträger voll ist.

Derzeit muss ich diese Datei manuell löschen, um zu vermeiden, dass die Festplatte voll ist. Ich habe gelesen, dass es in Docker 1.8 einen Parameter zum Drehen der Protokolle gibt . Was würden Sie als aktuelle Problemumgehung empfehlen?

poiuytrez
quelle
2
Als aktuelle Problemumgehung können Sie die Protokolle vollständig deaktivieren, wenn dies für Sie nicht von Bedeutung ist. Dies kann durch Starten des Docker-Daemons mit erfolgen --log-driver=none. Wenn Sie Protokolle nur für bestimmte Container deaktivieren möchten, können Sie sie --log-driver=noneim docker runBefehl starten . Eine andere Möglichkeit könnte darin bestehen, einen externen Speicher zu mounten /var/lib/docker. Wie eine NFS-Freigabe oder etwas, das mehr Speicherkapazität als der betreffende Host hat.
Dharmit
2
Oder verwenden Sie den journaldProtokolltreiber und sorgen Sie sich um die Protokollrotation.
Larsks
@Dharmit wo befindet es sich auf CoreOs?
Poiuytrez
@larsks Wie kann ich das unter CoreOS machen? Es scheint, dass Journald installiert ist und Protokolle in / var / log / journal generiert, aber ich habe auch Protokolle in /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log
poiuytrez
1
@poiuytrez wo befindet sich was? Wenn Sie bereit sind, den Docker-Daemon mit der vorgeschlagenen Option zu starten, ist dies /usr/lib/systemd/system/docker.servicemöglicherweise die Datei. Ich bin mir bei CoreOS nicht sicher. Unter CentOS ist dies der Ort. Was andere Fragen betrifft, müssen Sie die Optionen des Docker-Dämons ändern, um sie journaldals Protokollierungstreiber zu verwenden . Dann werden Container mit Journald protokolliert und nicht protokolliert /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log. @larsks korrigieren mich, wenn mir etwas fehlt.
Dharmit

Antworten:

83

Docker 1.8 wurde mit einer Protokollrotationsoption veröffentlicht. Hinzufügen:

--log-opt max-size=50m 

Wenn der Container gestartet wird, reicht der Trick aus. Weitere Informationen finden Sie unter: https://docs.docker.com/engine/admin/logging/overview/

poiuytrez
quelle
Zu beachten ist, dass dies nur für JSON- und fließende Protokolle verfügbar zu sein scheint.
Dman
5
Nur eine kurze Anmerkung, dass sich das Versionsschema nach Docker 1.13 geändert hat. Wenn Sie eine 17.03.0-cesolche Versionsnummer haben , bedeutet dies, dass Sie sich im neuen Versionsschema nach 1.13 befinden.
Tripleee
Nur zu wissen, dass Docker die Protokollrotation
ausführt,
41

VORSICHT: Dies gilt nur für Docker-Compose Version 2

Beispiel:

version: '2'
services:
  db:
    container_name: db
    image: mysql:5.7
    ports:
      - 3306:3306
    logging:
      options:
        max-size: 50m
jaks
quelle
3
Das Neustarten meines Dienstes mit diesem Protokollierungsabschnitt funktioniert, aber es scheint keine Auswirkungen zu haben. Die JSON-Protokolldatei wächst einfach weiter wie zuvor ...
Dokaspar
2
Für Version 3 siehe docs.docker.com/compose/compose-file/#logging
jausen brett
9

Achtung: Dieser Beitrag bezieht sich auf Docker-Versionen <1.8 (die keine --log-optOption haben).

Warum verwenden Sie nicht logrotate (das auch die Komprimierung unterstützt)?

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

Konfigurieren Sie es entweder direkt auf Ihrem CoreOs-Knoten oder stellen Sie einen Container (z. B. https://github.com/tutumcloud/logrotate ) bereit, der / var / lib / docker zum Drehen der Protokolle bereitstellt .

gtonisch
quelle
7
Ich denke nicht, dass dies eine gute Lösung ist. Sie müssen den laufenden Daemon zurückspringen lassen, um das Schreiben in das alte Protokoll zu beenden und mit dem Schreiben in das neue Protokoll zu beginnen. Andernfalls verweist der Linux-Kernel weiterhin auf alte Protokolldateien im Speicher (im Gegensatz zur Festplatte). Logrotate kann dies mit normalen Daemons tun, aber das Abprallen des Dockers oder des Containers führt zu Ausfallzeiten.
Dman
1
Guter Punkt, ich stimme zu. Diese Antwort wurde in den frühen Tagen von Docker (tm) gegeben, während die gebauten Funktionen (wie in der anderen Antwort erwähnt) die Arbeit erledigen sollten.
Gtonic
Dies hat einige Probleme, es dreht Protokolle, aber immer noch zeigt der Festplattenverbrauch ähnlich. Ich habe v5.0.2 verwendet und musste es dann mit dem Skript get.docker.com auf den neuesten Stand bringen , um die Option --log-opt mit dem Befehl docker create oder run zu verwenden.
v_sukt
5

Übergeben Sie die Protokolloptionen, während Sie einen Container ausführen. Ein Beispiel ist wie folgt

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

Dabei wird --log-opt max-size=5mdie maximale Größe der Protokolldatei auf 5 MB --log-opt max-file=10festgelegt und die maximale Anzahl der zu drehenden Dateien angegeben.

Visruth
quelle
4

[Diese Antwort behandelt aktuelle Docker-Versionen für diejenigen, die lange nach der Beantwortung auf die Frage stoßen.]

Um die Standardprotokollgrenzen für alle neu erstellten Container festzulegen, können Sie in /etc/docker/daemon.json Folgendes hinzufügen:

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

Laden Sie dann Docker mit neu, systemctl reload dockerwenn Sie systemd verwenden (andernfalls verwenden Sie den entsprechenden Neustartbefehl für Ihre Installation).

Sie können auch mit einer ähnlichen Datei zum lokalen Protokollierungstreiber wechseln:

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

Der lokale Protokollierungstreiber speichert den Protokollinhalt in einem internen Format (ich glaube Protobufs), sodass Sie mehr Protokollinhalte in derselben Protokolldatei erhalten (oder weniger Dateibereich für dieselben Protokolle benötigen). Der Nachteil des lokalen Treibers sind externe Tools wie Protokollweiterleitungen, die möglicherweise nicht in der Lage sind, die Rohprotokolle zu analysieren. Werden die bewusst docker logsfunktioniert nur , wenn die Protokolltreiber eingestellt ist json-file, localoder journald.

Das max-sizeist eine Grenze für die Docker Protokolldatei, so enthält es die json oder lokale Protokolloverhead - Formatierung. Und das max-fileist die Anzahl der Protokolldateien, die Docker verwalten wird. Nachdem die Größenbeschränkung für eine Datei erreicht wurde, werden die Protokolle gedreht und die ältesten Protokolle werden gelöscht, wenn Sie sie überschreiten max-file.

Weitere Informationen zu Docker finden Sie unter: https://docs.docker.com/config/containers/logging/configure/

Ich habe auch eine Präsentation zu diesem Thema. Verwenden Sie Pdiese Option , um die Präsentationsnotizen anzuzeigen: https://sudo-bmitch.github.io/presentations/dc2019/tips-and-tricks-of-the-captains.html#logs

BMitch
quelle
1

Beispiel für Docker-Compose Version 1:

mongo:
  image: mongo:3.6.16
  restart: unless-stopped
  log_opt:
    max-size: 1m
    max-file: "10"
Vlad Rudenko
quelle