Log-Rotation für Docker - Festplattenfüller vermeiden
Log-Rotation für Docker - Festplattenfüller vermeiden
Der Standard-Log-Treiber von Docker schreibt Logs unbegrenzt auf die Disk – ohne Konfiguration sind volle Festplatten nur eine Frage der Zeit.
Das Problem
Docker speichert Container-Logs standardmäßig als JSON unter:
/var/lib/docker/containers/<container-id>/<container-id>-json.log
Ohne Rotation wächst diese Datei endlos. Bei einer aktiven Webanwendung können das schnell Gigabytes in wenigen Tagen sein.
# Aktuelle Log-Größen prüfen
find /var/lib/docker/containers/ -name "*-json.log" -exec du -sh {} \; | sort -rh
Globale Konfiguration über daemon.json
Die sauberste Lösung: Log-Rotation für alle Container im Daemon konfigurieren.
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
max-size: Maximale Größe einer Log-Datei (10m = 10 Megabyte)max-file: Anzahl rotierter Dateien die behalten werden (3 Dateien × 10m = max. 30m pro Container)
Daemon neu starten:
systemctl restart docker
Wichtig: Bestehende Container übernehmen die neue Konfiguration erst nach einem Recreate (docker compose up -d). Laufende Container behalten ihren alten Log-Treiber bis sie neu erstellt werden.
Per-Container-Konfiguration in Compose
Wenn man für einzelne Services abweichende Limits möchte:
services:
app:
image: myapp
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5"
worker:
image: myworker
logging:
driver: json-file
options:
max-size: "5m"
max-file: "2"
Per-Container-Einstellungen überschreiben die daemon.json-Defaults.
Alternativer Treiber: journald
Wenn systemd auf dem Host läuft, kann Docker Logs direkt an journald übergeben:
{
"log-driver": "journald"
}
Vorteile: systemd kümmert sich um Rotation und Retention (konfigurierbar in /etc/systemd/journald.conf). Logs per journalctl aufrufbar.
journalctl CONTAINER_NAME=mycontainer -f
Alternativer Treiber: Loki
Für zentrales Logging mit Grafana Loki:
services:
app:
image: myapp
logging:
driver: loki
options:
loki-url: "http://localhost:3100/loki/api/v1/push"
loki-batch-size: "400"
Plugin vorher installieren:
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
Effektive Konfiguration bestätigen
# Log-Treiber eines laufenden Containers prüfen
docker inspect mycontainer | grep -A 10 LogConfig
Empfehlung für Produktivsysteme
Globale daemon.json mit 10m/3 ist ein guter Ausgangswert. Hochfrequente Dienste (Reverse Proxy, Message Broker) bekommen per Compose höhere Limits. Für zentrale Log-Aggregation: Loki + Grafana oder ELK-Stack.