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.