Zusammenfassung in 3 Sätzen

  • Die Konsolen-Logs von Docker-Containern werden als Dateien auf der Festplatte des Hosts gespeichert, nicht im System-Arbeitsspeicher.
  • Der Befehl docker logs liest diese gespeicherten Dateien und zeigt sie an.
  • Um ein unbegrenztes Anwachsen der Logdateien zu verhindern, ist die Konfiguration der Log-Rotation-Optionen (max-size, max-file) äußerst wichtig.

1. Wo und wie werden Logs gespeichert?

Docker erfasst sowohl den Standard-Output (stdout) als auch den Standard-Error (stderr) der Container-Streams und verarbeitet sie über einen Logging Driver. Wenn keine spezifische Konfiguration vorgenommen wird, verwendet Docker standardmäßig den json-file Logging Driver.

  • Speicherort: Die Logs der Container werden als JSON-Dateien in einem spezifischen Pfad auf dem Host-System gespeichert. Typischerweise ist dies der Pfad:
    • /var/lib/docker/containers/[CONTAINER_ID]/[CONTAINER_ID]-json.log
  • Der docker logs Befehl: Dieser Befehl zeigt nicht etwa Inhalte aus dem Arbeitsspeicher an, sondern liest die oben genannten JSON-Logdateien und gibt sie im Terminal aus.

Diagramm zur Speicherung von Docker-Logs

2. Führt ein kontinuierliches Anwachsen der Logs nicht zu Festplattenplatzmangel?

Ja, genau. Ohne entsprechende Maßnahmen können Logdateien unbegrenzt wachsen und den gesamten Festplattenspeicher des Hosts belegen. Um dies zu verhindern, bietet Docker Log-Rotation-Optionen an, die die Größe und Anzahl der Logdateien begrenzen.

Zum Beispiel können Sie beim Ausführen des docker run-Befehls folgende Optionen hinzufügen:

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
  • --log-opt max-size=10m: Begrenzt die maximale Größe einer Logdatei auf 10 MB.
  • --log-opt max-file=3: Begrenzt die maximale Anzahl der Logdateien auf 3. Wenn diese Anzahl überschritten wird, wird die älteste Datei gelöscht.

Mit dieser Einstellung belegen die Logs des betreffenden Containers maximal 30 MB (10 MB * 3 Dateien) Speicherplatz auf der Festplatte.


3. docker-compose.yml-Datei konfigurieren

Mit Docker Compose können Sie die Logging-Optionen für jeden Dienst ganz einfach direkt in der docker-compose.yml-Datei konfigurieren.

Stellen Sie sich vor, die --log-opt-Flags des docker run-Befehls werden in YAML-Format übertragen.

Unten sehen Sie ein Beispiel für die Anwendung der Log-Rotation auf einen Dienst namens my-app.

services:
  my-app:
    image: your-app-image
    # ... weitere Einstellungen ...
    deploy:
      resources:
        limits:
          memory: 512M

    # 👇 Dieser Abschnitt ist für die Log-Konfiguration.
    logging:
      driver: "json-file"  # Zu verwendender Logging Driver (kann weggelassen werden, da Standardwert)
      options:
        max-size: "10m"    # Maximale Größe pro Datei: 10 MB
        max-file: "3"      # Maximale Anzahl von Dateien: 3
  • logging: Dies ist der Schlüssel, der die Logging-Konfiguration für den jeweiligen Dienst einleitet.
  • driver: Gibt den zu verwendenden Logging Driver an. json-file ist der Standardwert.
  • options: Hier werden die an den Driver zu übergebenden Optionen festgelegt.
    • max-size: Entspricht --log-opt max-size von docker run.
    • max-file: Entspricht --log-opt max-file von docker run.

Wenn Sie diesen Dienst nun mit docker-compose up starten, werden die Logs des my-app-Containers automatisch rotiert und belegen maximal 30 MB (10 MB * 3 Dateien) Festplattenspeicher.

4. Globale Standardeinstellungen für alle Container

Wenn Sie es umständlich finden, jedem Container einzeln Optionen zuzuweisen, und stattdessen eine globale Standardrichtlinie für das gesamte System anwenden möchten, ist die Modifikation der Docker Daemon Konfigurationsdatei der beste Weg.

  1. Öffnen oder erstellen Sie die Datei /etc/docker/daemon.json. (Falls die Datei nicht existiert, erstellen Sie sie neu.)
  2. Fügen Sie den folgenden Inhalt hinzu:
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}

3. Starten Sie den Docker-Daemon neu.

sudo systemctl restart docker

Mit dieser Konfiguration folgen alle zukünftig erstellten Container automatisch dieser Richtlinie, sofern keine separate Logging-Konfiguration vorgenommen wird. Beachten Sie, dass individuelle Einstellungen, die in der docker-compose.yml-Datei oder über den docker run-Befehl für bestimmte Container festgelegt werden, Vorrang vor den Daemon-Einstellungen haben.

  • Individuelle Dienstkonfiguration: Die Einstellung im logging-Abschnitt der docker-compose.yml-Datei ist am gebräuchlichsten und bequemsten.
  • Globale Standardeinstellung: Um eine einheitliche Richtlinie für alle Container auf dem Server anzuwenden, bearbeiten Sie die Datei /etc/docker/daemon.json.