Docker-Log-Rotation mit einem Logging-Treiber konfigurieren: Docker-journald-Logging und lokaler Docker-Dateitreiber
Niveau: Experte
Geschätzte Dauer: ~20 Minuten
Ziel: Docker-Log-Rotation konfigurieren, um ein Log-Management ohne Ausfallzeiten zu gewährleisten und die Erschöpfung des Speicherplatzes zu verhindern.
Einführung
Nicht verwaltete Docker-Logs können den Serverspeicher in kurzer Zeit erschöpfen. Standardmäßig schreibt der Docker-Daemon Logs im Format json-file ohne Größenbeschränkung. Für eine zuverlässige Infrastruktur müssen Sie die Docker-Log-Rotation mit einem skalierbaren Docker-Logging-Treiber konfigurieren. Diese Anleitung beschreibt, wie Sie die Docker-Log-Rotation global entweder mit Docker-journald-Logging oder mit dem lokalen Docker-Dateitreiber (local) umsetzen. Die richtige Konfiguration sorgt für effizientes Log-Management und Systemstabilität.
Terminologie
Machen Sie sich vor dem Fortfahren mit den folgenden grundlegenden Begriffen vertraut:
- Docker: Eine Plattform zum Ausführen von Anwendungen in isolierten Umgebungen, den sogenannten Containern.
- Docker-Logs: Die Ausgabeströme, die von Stdout (Standardausgabe) und Stderr (Standardfehlerausgabe) eines Containers erfasst werden.
- Log-Rotation: Das Archivieren und Löschen alter Logs, um Speicherplatz freizugeben.
- Logging-Treiber: Der Mechanismus, mit dem Docker Logs erfasst, formatiert und weiterleitet.
- Journald: Der Logging-Dienst von systemd, ideal für zentrales Logging auf dem Host.
- Lokaler Dateitreiber (local): Ein leistungsstarker, integrierter Treiber, der für lokalen Speicher optimiert ist.
- Json-file: Der Standardtreiber, der Logs im JSON-Format schreibt.
- Docker-Daemon: Der Hintergrunddienst, der die Docker-Vorgänge verwaltet.
- Daemon.json: Die Konfigurationsdatei des Daemons.
- Log-Treiber-Konfiguration: Die globale oder containerspezifische Logging-Einrichtung.
- Log-Optionen: Spezifische Parameter, die an den Treiber übergeben werden.
- Max-size: Die Schwellengröße, ab der eine Log-Datei rotiert wird.
- Max-file: Die maximale Anzahl rotierter Dateien, die aufbewahrt werden.
Voraussetzungen
Stellen Sie vor dem Start sicher, dass Folgendes vorhanden ist:
- Betriebssystem: Ubuntu 22.04 / 24.04 LTS, Debian 12 / 13, RHEL 9 / 10, AlmaLinux 9 / 10, Rocky Linux 9 / 10
- Docker: Version 24.x oder neuer installiert
- Zugriff: sudo-Berechtigungen
- Erforderliche Kenntnisse: Linux-Administration und Grundlagen von Infrastructure as Code
Schritt 1: Docker json-file und local im Vergleich verstehen
Beim Vergleich von Docker json-file und local entscheiden Leistung und Overhead über die Wahl. Der Standardtreiber json-file ist einfach, verbraucht aber aufgrund der JSON-Formatierung mehr CPU und Speicherplatz. Der Dateitreiber local dagegen verwendet ein binäres Append-only-Format, das gezielt auf effiziente Rotation optimiert ist. In normalen Produktivlasten verringert der lokale Docker-Dateitreiber (local) den Speicher-Overhead und erzwingt die Rotation zuverlässig nativ.
Führen Sie Folgendes aus, um Ihren aktuellen Treiber zu prüfen:
docker info --format '{{.LoggingDriver}}'
Erwartete Ausgabe:
json-file
Wenn Sie json-file sehen, fahren Sie mit der Anpassung der Docker-Logging-Konfiguration in daemon.json fort.
Schritt 2: Docker-Log-Rotation mit dem lokalen Docker-Dateitreiber konfigurieren
Um globale Limits für alle Container durchzusetzen, bearbeiten Sie die Datei /etc/docker/daemon.json. Dies ist der empfohlene Ansatz für die Docker-Logging-Konfiguration in daemon.json.
Öffnen Sie die Konfigurationsdatei:
Falls /etc/docker/daemon.json auf Ihrem System nicht existiert, legt nano sie beim Speichern an. Das ist normal - Docker verwendet integrierte Standardwerte, wenn die Datei fehlt.
sudo nano /etc/docker/daemon.json
Fügen Sie die folgende Log-Treiber-Konfiguration hinzu:
{ "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "3" } }
Speichern und schließen Sie die Datei. Die neuen Einstellungen werden auf die Festplatte geschrieben. Diese Konfiguration wendet den Treiber global an. Die Log-Optionen weisen Docker an, Logs zu rotieren, sobald sie 50 Megabyte erreichen (max-size für Docker-Logs), und höchstens 3 Dateien aufzubewahren (max-file für Docker-Logs). Beachten Sie, dass der Treiber local diese expliziten Größen- und Dateibeschränkungen im Gegensatz zu journald weiterhin nativ unterstützt.
Starten Sie den Docker-Daemon neu, um die Änderungen anzuwenden. Der docker.service verwaltet die Container, daher werden die Limits durch seinen Neustart wirksam:
sudo systemctl restart docker
Die Verbindung zum Daemon ist für einige Sekunden unterbrochen. Nach dem Neustart verwenden alle neu erstellten Container den lokalen Docker-Dateitreiber (local) und erben diese Limits für max-size und max-file der Docker-Logs.
Der Logging-Treiber ist pro Container unveränderlich. Bestehende Container behalten ihren alten Log-Treiber; docker update kann ihn nicht ändern. Zur Anwendung des neuen Docker-Logging-Treibers ist eine Neuerstellung des Containers erforderlich (z. B. mit docker compose up -d oder einem Redeployment über die Orchestrierung), da es keine Live-Migration gibt. Andernfalls entstehen auf Ihrem Host gemischte Logging-Zustände.
Beachten Sie außerdem die Rangfolge der Logging-Konfigurationen:
- CLI-Flags (
docker run --log-driver) haben Vorrang vor allem anderen. - Logging-Überschreibungen in
docker-compose.ymlgelten pro Service zum Zeitpunkt der Container-Erstellung. daemon.jsondient als globaler Standardwert für alle Container ohne explizite Angabe.
Schritt 3: Docker-journald-Logging als Docker-Logging-Treiber aktivieren
Alternativ können Sie Logs direkt an den journald-Daemon des Systems weiterleiten. Docker-journald-Logging fügt sich nahtlos in systemctl und externe Log-Forwarder ein.
Öffnen Sie die Konfigurationsdatei:
sudo nano /etc/docker/daemon.json
Ersetzen Sie den Inhalt durch die journald-Konfiguration. Ersetzen Sie den Dateiinhalt vollständig - entfernen Sie alle vorherigen log-opts-Einträge, da journald die Optionen max-size und max-file nicht unterstützt:
{ "log-driver": "journald" }
Speichern und schließen Sie die Datei. Die Konfiguration ist aktualisiert.
Starten Sie den Dienst neu. Der docker.service muss neu geladen werden, damit das Log-Management auf journald umgestellt wird:
sudo systemctl restart docker
Bei Verwendung von Docker-Logs mit journald entfällt die Rotationskontrolle auf der Docker-Seite. Die Log-Rotation besteht weiterhin, wird aber vollständig außerhalb von Docker vom systemd-Journal übernommen. Die Logs werden direkt an das systemd-Journal geleitet. Sie werden über Container-Metadatenfelder indiziert und sind nicht an die Unit docker.service gebunden.
Operativ verwaltet journald diese Logs anhand konkreter Limits, die in /etc/systemd/journald.conf konfiguriert werden, insbesondere SystemMaxUse, RuntimeMaxUse und MaxRetentionSec. Das birgt ein erhebliches Risiko mit großem Wirkungsradius (Blast Radius): Ist journald erschöpft, kann dies in der Produktion SSH-Logging, Kernel-Logs, Audit-Logs und alle anderen Dienste beeinträchtigen, die sich das Journal teilen. Beachten Sie, dass die Optionen max-size und max-file nur für die Treiber json-file und local gelten, nicht für journald.
So wenden Sie Änderungen an der journald-Konfiguration an:
sudo systemctl restart systemd-journald # Or to trigger immediate rotation without a full restart: sudo systemctl kill -s SIGUSR2 systemd-journald
Verwenden Sie Docker-Logs mit journald in Umgebungen, in denen Logs direkt aus dem System-Journal ausgelesen werden.
Schritt 4: journalctl-Ausgabe verwalten
Wenn Sie die Docker-Log-Rotation über journald konfigurieren, greifen Sie mit journalctl statt mit docker logs auf die Logs zu. Der Dienst journald verarbeitet diese Logs zentral.
Um die Logs eines bestimmten Containers mit Docker-Logs über journald anzuzeigen, führen Sie Folgendes aus:
journalctl CONTAINER_NAME=<YOUR_CONTAINER_NAME> -o cat
Wenn Sie lieber nach ID statt nach Name filtern möchten, verwenden Sie CONTAINER_ID_FULL=$(docker inspect -f '{{.Id}}' <YOUR_CONTAINER_NAME>) für die vollständige ID, oder leiten Sie die ID durch cut -c1-12, um die in CONTAINER_ID gespeicherte Kurzform zu erhalten. Das Feld _CONTAINER_ID gehört zu systemd-cgroup und entspricht nicht der Docker-Container-ID.
Erwartete Ausgabe:
Application started successfully
Schritt 5: Überprüfung
Um die Konfiguration des Docker-Logging-Treibers an einem laufenden Container zu überprüfen, starten Sie einen Test-Container:
docker run -d --name log-test nginx:latest
Prüfen Sie die Log-Optionen des Containers:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' log-test
Erwartete Ausgabe für den Treiber local:
local
Wenn Sie journald konfiguriert haben, lautet die Ausgabe stattdessen journald.
Prüfen Sie die angewendeten Parameter für den Treiber local:
docker inspect -f '{{.HostConfig.LogConfig.Config}}' log-test
Erwartete Ausgabe:
map[max-file:3 max-size:50m]
Das bestätigt, dass Ihre Docker-Logging-Konfiguration in daemon.json die Parameter max-size und max-file der Docker-Logs erfolgreich angewendet hat. Beachten Sie, dass journald die Optionen max-size und max-file hier nicht anzeigt, da die Rotation an das Betriebssystem delegiert wird.
Mit diesem Befehl finden Sie bereits vorhandene Container, die noch den vorherigen Treiber verwenden. Der Logging-Treiber wird bei der Container-Erstellung festgelegt - diese Container müssen neu erstellt werden (z. B. mit docker compose up -d --force-recreate), um die neue Konfiguration zu übernehmen:
docker ps -aq | xargs -r docker inspect -f '{{.Name}}: {{.HostConfig.LogConfig.Type}}'
Änderungen rückgängig machen
Um die globale Log-Treiber-Konfiguration auf das Standardformat zurückzusetzen, entfernen Sie die Konfiguration aus daemon.json.
Entfernen Sie die Datei (sichern Sie Konfigurationsdateien vor Änderungen immer) und starten Sie den Docker-Dienst neu:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%F) sudo rm /etc/docker/daemon.json sudo systemctl restart docker
Das Rückgängigmachen dieser Änderungen hebt die Limits für alle neu erstellten Container sofort auf. Erzeugen diese große Log-Mengen, droht die Erschöpfung des Speicherplatzes.
Wenn /etc/docker/daemon.json weitere, nicht damit zusammenhängende Daemon-Einstellungen enthält (Registry-Mirrors, Storage-Treiber, DNS, MTU, insecure-registries usw.), werden diese beim Entfernen der Datei ebenfalls gelöscht. Sichern Sie die Datei entweder zuerst (wie oben gezeigt) oder bearbeiten Sie sie manuell und entfernen Sie nur die Abschnitte log-driver und log-opts.
Fehlerbehebung
journalctlliefert fürCONTAINER_IDkeine Ausgabe: Der Docker-Treiberjournaldschreibt die kurze, 12-stellige ID inCONTAINER_ID, währenddocker inspectdie vollständige, 64-stellige ID zurückgibt. Verwenden Sie stattdessenCONTAINER_NAMEoderCONTAINER_ID_FULL.- Bestehende Container verwenden nach dem Neustart weiterhin
json-file: Der Befehldocker updateändert den Logging-Treiber nicht. Sie müssen den Container neu erstellen (z. B. mitdocker compose downund anschließendup), um den neuen Logging-Treiber anzuwenden. max-sizeundmax-filehaben mitjournaldkeine Wirkung: Die Log-Rotation fürjournaldwird global über/etc/systemd/journald.conf(z. B.SystemMaxUse) gesteuert, nicht über dielog-optsvon Docker.
Fazit
Die richtige Verwaltung der Container-Ausgabe ist ein grundlegender Bestandteil einer zuverlässigen Infrastruktur. Mit der richtigen Wahl zwischen Docker json-file und local vermeiden Sie Speicherprobleme. Ob Sie die Docker-Log-Rotation mit dem schlanken lokalen Docker-Dateitreiber (local) konfigurieren oder sich nativ über Docker-journald-Logging integrieren: Ihre Umgebung ist nun darauf vorbereitet, große Log-Datenströme sicher zu verarbeiten. Mit diesen Verfahren zur Docker-Log-Rotation bleibt die Konfiguration Ihres Docker-Logging-Treibers stabil und Ihre Host-Ressourcen bleiben planbar.
Dokumentversion: 1.0
Zuletzt aktualisiert: Mai 2026
Verantwortlich: Team für technische Dokumentation