Docker-Log-Management in der Praxis: Von Treiber-Konfiguration bis zentraler Sammlung

Das Handy vibrierte: Festplattenalarm auf dem Produktionsserver, Schwellwert 85 %.
Ich öffnete den Laptop und loggte mich per SSH ein. df -h zeigte: auf der Root-Partition blieben nur noch 12 % frei. Nach einer Runde Diagnose fand ich in /var/lib/docker/containers den Übeltäter – ein Nginx-Container, der seit zwei Wochen lief, mit Log-Dateien von 12 GB.
Viele wissen nicht: Docker begrenzt Log-Größe standardmäßig nicht. Der Container schrieb täglich Zehntausende Access-Logs; der json-file-Treiber speicherte alles – in zwei Wochen war die Platte voll.
Ich löschte die Log-Datei und richtete Rotation für alle Container ein. Das zog bis vier Uhr morgens.
Danach habe ich eine Woche lang Docker-Log-Management systematisch aufgearbeitet – Treiberwahl, Rotationsparameter, zentrale Sammlung in Multi-Container-Umgebungen. Dieser Artikel fasst die Lehren aus jenem Vorfall zusammen.
1. Überblick über Docker-Log-Treiber
Grundlage: Container-Logs werden nicht beliebig geschrieben – ein Log-Treiber legt fest, wohin sie gehen und wie sie gespeichert werden.
Docker unterstützt mehrere Treiber für unterschiedliche Szenarien. Standard ist json-file: stdout und stderr landen als JSON in einer lokalen Datei unter /var/lib/docker/containers/<Container-ID>/<Container-ID>-json.log.
json-file ist einfach – keine Extra-Konfiguration, einheitliches Format, docker logs funktioniert direkt. Der Haken: keine Größenbegrenzung. Läuft der Container dauerhaft, wachsen die Logs, bis die Festplatte voll ist.
Die folgende Tabelle fasst sechs gängige Treiber zusammen:
| Treiber | Einsatz | Strukturiert | Externer Dienst | Performance |
|---|---|---|---|---|
| json-file | Entwicklung, Single-Host | Ja (JSON) | Nein | Niedrig |
| syslog | Bestehende syslog-Infrastruktur | Nein (Parsing nötig) | Ja (rsyslog) | Niedrig |
| journald | systemd-Umgebung | Teilweise | Nein | Niedrig |
| fluentd | Cloud-native Observability, zentrale Sammlung | Ja (eigene Tags) | Ja (Fluentd) | Mittel |
| gelf | Graylog-Nutzer | Ja | Ja (Graylog) | Mittel |
| none | Logs deaktivieren, temporäre Container | Nein | Nein | Keine |
json-file und syslog sind am verbreitetsten. json-file für lokales Debugging und leichte Deployments; syslog, wenn rsyslog oder syslog-ng bereits da ist – Logs gehen direkt in die zentrale Infrastruktur.
journald übergibt Logs an systemd journal. Auf modernen Linux-Systemen mit systemd praktisch; Abfrage mit journalctl.
fluentd und gelf zielen auf zentrale Sammlung. fluentd kann an Elasticsearch, Kafka, Cloud-Speicher u. a. senden; gelf ist das Graylog-Format. Beide brauchen zusätzliche Dienste – sinnvoll in Clustern mit vielen Containern.
none deaktiviert Logging – für temporäre oder Batch-Container, bei denen Logs irrelevant sind.
Auswahl:
- Single-Host, Entwicklung: json-file mit Rotation (nächster Abschnitt).
- Unternehmen mit syslog: syslog, Infrastruktur wiederverwenden.
- Cluster, zentrale Sicht: fluentd oder Loki (später ausführlich).
- Temporäre Container ohne Logs: none.
2. Log-Rotation in der Praxis
Zurück zum 12-GB-Problem: vermeiden mit Rotationsparametern.
json-file unterstützt drei zentrale Optionen:
- max-size: Maximale Größe einer Log-Datei. Wird sie überschritten, legt Docker eine neue an; alte Dateien werden nummeriert. Beispiel
max-size=10m: maximal 10 MB pro Datei. - max-file: Anzahl behaltener Archivdateien. Älteste werden gelöscht. Beispiel
max-file=3: bis zu drei Archive plus die aktuelle Datei. - compress: Archivierte Dateien komprimieren (Standard: false). Spart Platz, leicht mehr CPU.
Kombiniert z. B. max-size=10m, max-file=3 begrenzen Sie die Belegung auf etwa 30 MB (mit compress oft weniger).
Konfiguration: global vs. pro Container
Rotation ist auf drei Ebenen möglich:
1. Global (daemon.json)
Gilt für alle Container – einmal einrichten. In /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
Docker-Daemon neu starten: sudo systemctl restart docker. Neue Container erben die Einstellungen.
Hinweis: Bestehende Container bleiben unverändert – neu anlegen oder einzeln anpassen.
2. Pro Container (docker run)
Für individuelle Limits:
docker run -d \
--name nginx \
--log-driver json-file \
--log-opt max-size=50m \
--log-opt max-file=5 \
--log-opt compress=true \
nginx:alpine
Bei hohem Traffic z. B. max-size=50m, max-file=10 für mehr Puffer.
3. Docker Compose
In Produktion meist der Standard:
version: "3.9"
services:
webapp:
image: webapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
compress: "true"
nginx:
image: nginx:alpine
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
Pro Service eigene Werte – flexibel.
Empfohlene Werte für Produktion
SigNoz empfiehlt in seinem Leitfaden von 2024 unter anderem:
- Entwicklung/Test:
max-size=10m, max-file=3– ausreichend. - Mittlerer Traffic:
max-size=50m, max-file=5– mehr Historie für Analysen. - Hoher Traffic:
max-size=100m, max-file=10– weniger Risiko, dass Rotation zu schnell Historie löscht.
Die exakten Werte hängen vom Szenario ab. Prinzip: Balance zwischen Festplatte und Bedeutung der Logs – viel Platz und wichtige Logs: großzügiger; knappe Platte, weniger kritische Logs: straffer.
3. Zentrale Log-Sammlung im Vergleich
Rotation reicht auf einem Host. Bei vielen Containern auf mehreren Maschinen ist docker logs pro Server mühsam.
Zentrale Sammlung bündelt alles an einem Ort – Speicherung und Abfrage einheitlich.
Drei gängige Ansätze:
ELK Stack (Elasticsearch + Logstash + Kibana)
Klassiker: Logstash sammelt, Elasticsearch indexiert, Kibana visualisiert.
Stärken: Volltextsuche, komplexe Queries, reife Ökosystem. Schwächen: hoher Ressourcenbedarf – Elasticsearch oft mehrere GB RAM; Logstash schwer und komplex.
Für große Unternehmen mit Ops-Team, hohem Log-Volumen und anspruchsvollen Abfragen.
EFK (Fluentd statt Logstash)
Fluentd ist leichter (hunderte MB RAM), viele Plugins, viele Quellen und Ziele. Elasticsearch bleibt schwer – Gesamtaufwand weiterhin hoch, eher mittelgroße bis große Teams.
Loki + Promtail + Grafana
Loki indexiert nur Labels (Containername, App), nicht den Volltext – Inhalt in komprimierten Dateien, Abfrage per grep-ähnlichem Matching.
Ergebnis: sehr geringer Footprint, günstiger Speicher als Elasticsearch. Promtail als Agent, Grafana als UI – nahtlos integriert.
Ideal für Cloud-native und Kubernetes; für kleine Teams mit begrenztem Budget oft die beste Relation.
Vergleich
| Lösung | Vorteile | Nachteile | Skala | Kosten |
|---|---|---|---|---|
| ELK | Mächtig, flexibel, reif | Ressourcenintensiv, komplex, teurer Speicher | Großunternehmen | Hoch |
| EFK | Fluentd leicht, viele Plugins | Elasticsearch schwer, Setup aufwendig | Mittel–groß | Mittel–hoch |
| Loki | Sehr leicht, günstig, cloud-native | Schwächere Volltextsuche | Klein/K8s | Niedrig |
Empfehlung:
- Kleines Team (unter 10 Personen), knappes Budget: Loki.
- Mittleres Team (10–50), Ops-Kapazität vorhanden: Loki oder EFK – je nach Log-Volumen.
- Großes Unternehmen, professionelles Ops: ELK.
Mit Grafana-Monitoring ist Loki oft die naheliegende Ergänzung – Metriken und Logs in einer Oberfläche.
4. Fallstricke in der Produktion
Abschließend ein paar Stolpersteine aus der Praxis.
1. Keine Rotation – volle Festplatte
Der häufigste Fehler: Container deployen, an Logs nicht denken – Monate später Alarm und Log-Dateien im zweistelligen GB-Bereich.
Empfehlung: Globale Defaults in daemon.json. Menschen vergessen --log-opt; Konfiguration nicht.
2. Logs nach Neustart weg
json-file: Beim Löschen des Containers verschwinden die Log-Dateien. docker rm + docker run statt docker restart – Historie weg.
Problematisch bei Crash-Analysen: Container nachts neu gebaut, Logs vor dem Absturz nicht mehr da.
Empfehlung:
docker restartstatt Löschen und Neu-Anlegen.- Kritische Apps: fluentd oder syslog zu externem Speicher.
- Wichtige Logs in Produktion regelmäßig sichern.
3. Falsche Fluentd-Adresse
Mit fluentd gehen Logs per TCP an Fluentd. Falsche Adresse: Container startet, aber nichts wird gesammelt – Verlust fällt spät auf.
Beispiel:
docker run -d \
--log-driver fluentd \
--log-opt fluentd-address=127.0.0.1:24224 \
--log-opt tag="docker.{{.Name}}" \
my-web-app
fluentd-address muss zum tatsächlichen Listener passen. Standardport 24224, TCP.
Debugging:
- Fluentd läuft?
curl http://localhost:24224odernetstat -tlnp | grep 24224. docker inspect <Container-ID>– Log-Treiber korrekt?- Fluentd-Logs: kommen Docker-Streams an?
4. Monitoring und Alarme
Log-Management endet nicht bei der Konfiguration.
Zwei Kennzahlen:
- Festplatte: Größe von
/var/lib/docker/containersregelmäßig prüfen; Alarm z. B. ab 10 GB. - Schreiblatenz: Bei zentraler Sammlung Fluentd/Loki beobachten – hohe Latenz deutet auf Netzwerk oder Speicher-Engpass.
Prometheus + Grafana oder ein Cron-Skript – je nach Aufwand.
Fazit
Kernpunkte des Docker-Log-Managements:
- Treiber: json-file am universellsten; syslog für bestehende Infrastruktur; fluentd für zentrale Sammlung.
- Rotation:
max-size+max-file; global in daemon.json oder pro Container/Compose. - Zentrale Sammlung: Loki für kleine Teams, ELK für große – je nach Größe und Budget.
- Fallstricke: Globale Rotation, Logs nicht durch Neuanlegen verlieren, Fluentd-Adresse prüfen, Festplatte überwachen.
Schnellvorlage:
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
Handlungsempfehlung: Wenn Sie noch keine Rotation haben – jetzt prüfen. Schauen Sie in /var/lib/docker/containers nach oversized Logs, tragen Sie Rotationsparameter in daemon.json ein, starten Sie den Docker-Daemon neu. Ein paar Minuten Arbeit können Sie vor dem nächtlichen Festplattenalarm bewahren.
Docker-Log-Rotation konfigurieren
Log-Rotation für Docker-Container einrichten, damit Log-Dateien die Festplatte nicht füllen
⏱️ Estimated time: 10 min
- 1
Step 1: Aktuellen Log-Status prüfen
Führen Sie folgende Befehle aus, um die Log-Belegung der Container zu prüfen:
```bash
# Gesamtgröße des Log-Verzeichnisses
du -sh /var/lib/docker/containers
# Log-Größe pro Container
docker ps -q | xargs -I {} sh -c 'echo -n "{}: "; docker inspect --format="{{.LogPath}}" {} | xargs du -sh 2>/dev/null || echo "N/A"'
```
Überschreitet ein Container 1 GB, sollten Sie Rotation konfigurieren. - 2
Step 2: Globale Standard-Rotation einrichten
Bearbeiten Sie `/etc/docker/daemon.json` und fügen Sie die Log-Treiber-Konfiguration hinzu:
```json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
```
Parameter:
- max-size: maximal 10 MB pro Datei
- max-file: 3 archivierte Dateien behalten
- compress: alte Dateien komprimieren - 3
Step 3: Docker neu starten
Starten Sie Docker neu, damit die Konfiguration wirksam wird:
```bash
sudo systemctl restart docker
```
**Hinweis**: Globale Einstellungen gelten nur für neue Container. Bestehende Container müssen neu erstellt oder einzeln konfiguriert werden. - 4
Step 4: Konfiguration verifizieren
Legen Sie einen Test-Container an:
```bash
# Test-Container erstellen
docker run -d --name test-nginx nginx:alpine
# Log-Konfiguration prüfen
docker inspect --format='{{.HostConfig.LogConfig}}' test-nginx
```
Die Ausgabe sollte `max-size=10m,max-file=3` enthalten. - 5
Step 5: Alte Container-Logs bereinigen (optional)
Bei zu großen Logs können Sie manuell aufräumen:
```bash
# Methode 1: Log-Datei leeren (ohne Container-Neustart)
sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' container-name)
# Methode 2: Container neu erstellen (empfohlen)
docker rm -f container-name
docker run ... # mit Log-Parametern neu anlegen
```
Neu erstellte Container übernehmen die globale Konfiguration.
FAQ
Was ist der Standard-Log-Treiber von Docker? Warum gibt es keine Größenbegrenzung?
Wie kombiniert man max-size und max-file sinnvoll?
Bleiben Logs nach Container-Löschung erhalten? Wie persistiert man sie?
ELK oder Loki – was passt zu kleinen Teams?
Was passiert bei falscher Fluentd-Adresse? Wie debuggen?
Wie wendet man neue Rotations-Einstellungen auf bestehende Container an?
Wie überwacht man die Festplattenbelegung durch Docker-Logs?
6 Min. Lesezeit · Veröffentlicht am: 30. Apr. 2026 · Aktualisiert am: 14. Juli 2026
Docker Praxisleitfaden
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
Docker-Log-Bereinigung Komplettguide: 5 Methoden gegen json.log auf voller Festplatte
Wachsen Docker-Log-Dateien unbegrenzt und füllen die Festplatte? So bereinigen Sie json.log, konfigurieren Log-Rotation und wählen den passenden Log-Treiber – und verhindern erneutes Volllaufen.
Teil 34 von 38
Nächster
Docker-Container-Debugging: exec nutzen – die richtige Art, Container-Probleme zu finden
Ausführliche Anleitung zu docker exec zum Debuggen in Containern: Unterschiede zu attach, Tool-Installation, Benutzerrechte und praktische Beispiele für schnelles Troubleshooting.
Teil 36 von 38
Ähnliche Beiträge
Docker vs. virtuelle Maschine: Performance-Unterschiede und Szenario-Auswahl in 5 Minuten

Docker vs. virtuelle Maschine: Performance-Unterschiede und Szenario-Auswahl in 5 Minuten
Docker-Installation ohne Fallstricke (2025): Vollständige Lösungen von permission denied bis zum erfolgreichen Start


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen