Auf meinem Server laufen inzwischen rund 50 Container. Ein Dienst schreibt nur ab und zu eine Zeile, der nächste protokolliert jede Anfrage. Das geht im Alltag unter, weil die Anwendungen trotzdem funktionieren. Wenn die Platte irgendwann voll ist, möchte ich nicht erst dann nach den Logs suchen. Deshalb schaue ich mir an, wohin Docker schreibt, und begrenze die Dateien für die Dienste, die ich über Compose betreibe.
Erst schauen, was Platz braucht
Mein erster Blick geht auf den freien Speicher:
df -h
docker system dfdocker system df zeigt, wie viel Platz Images, Container und Volumes belegen. Einzelne Logdateien lassen sich damit aber nicht zuverlässig beurteilen.

Für einen bestimmten Container frage ich deshalb Docker selbst nach dem Treiber und dem Log-Pfad:
docker inspect --format '{{.HostConfig.LogConfig.Type}}' CONTAINERNAME
docker inspect --format '{{.LogPath}}' CONTAINERNAMEDer erste Befehl ist entscheidend. Die folgenden Schritte mit einer Datei auf dem Host gelten für den Treiber json-file. Bei journald, local oder einem entfernten Logdienst sieht das anders aus. Docker speichert seine Daten außerdem nicht zwingend unter /var/lib/docker. Darum verlasse ich mich auf den ausgegebenen Pfad.
Mit sudo du -h PFAD-ZUR-LOGDATEI sehe ich die Größe, ohne in der Datei herumzuschreiben. Einen Überblick über besonders große Dateien kann ich mir mit
sudo find /var/lib/docker/containers -name '*-json.log' -size +100M -print verschaffen, sofern Docker tatsächlich dort liegt. Die Grenze von 100 MB ist nur ein Suchfilter. Große Logs sind ein Hinweis, keine Diagnose: Vielleicht meldet der Dienst seit Tagen denselben Fehler.
Rotation in Compose setzen
Für einen Compose-Dienst ergänze ich im Service-Block:
services:
mein-dienst:
image: beispiel/image:1.0
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"max-size startet nach etwa 10 MB eine neue Logdatei. max-file behält höchstens drei rotierte beziehungsweise aktuelle Dateien vor; ältere werden entfernt. So bleiben die letzten Meldungen mit docker compose logs lesbar. Die Beispiel-Image-Zeile ersetzt ihr natürlich durch eure vorhandene Service-Konfiguration. Ich würde die Log-Menge an den jeweiligen Dienst anpassen: Für eine ruhige Anwendung können drei mal zehn MB reichen, bei einer sehr gesprächigen Anwendung vielleicht nicht.
Bevor ich etwas neu starte, prüfe ich die zusammengesetzte Datei:
docker compose config --quiet
docker compose up -d --no-deps --force-recreate mein-dienstDer zweite Befehl erstellt nur den genannten Dienstcontainer neu. Dabei gibt es eine kurze Unterbrechung. In meiner produktiven Umgebung mache ich das deshalb Dienst für Dienst und schaue danach mit docker compose ps und docker compose logs --tail=50 mein-dienst nach, ob alles läuft. Daten und Uploads sollten vorher wie gewohnt in Volumes oder Bind Mounts liegen.
Prüfen, ob die Einstellung angekommen ist
Auf dem neu erstellten Container kontrolliere ich die Werte:
docker inspect --format '{{json .HostConfig.LogConfig}}' Dort sollten json-file, max-size und max-file erscheinen. Ein Eintrag in der Compose-Datei verändert einen bereits laufenden Container nicht rückwirkend. Das gilt auch für eine serverweite Änderung in /etc/docker/daemon.json: Sie wirkt erst auf neu erstellte Container; der Docker-Dienst muss für diese globale Variante zusätzlich neu gestartet werden.
Die vorhandene Logdatei fasse ich nicht mit einem Editor oder rm an. Docker warnt ausdrücklich davor, aktive Dateien des Log-Treibers selbst zu bearbeiten. Wenn ein Dienst ungewöhnlich viel protokolliert, suche ich außerdem nach dem Grund in seinen Meldungen. Sonst verschwinden mit der Rotation nur die Hinweise auf einen Fehler schneller.
Für den Einstieg in Compose habe ich bereits ein kleines Hello-World-Projekt mit Nginx beschrieben. Die Angaben zu json-file und zur Rotation stammen aus der Docker-Dokumentation. Meine Kontrolle bleibt einfach: einmal im Monat den freien Platz und die auffälligen Container prüfen, bevor mir eine volle Platte den Abend verdirbt.

Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Du kannst den Link auch in der Suche deiner eigenen Instanz öffnen. Öffentliche Antworten und bei Sharkey auch Home-Antworten können hier als Kommentare erscheinen. Antworten anderer Personen erscheinen nach Freigabe, deine eigenen direkt nach dem Abruf. Antworten nur für Follower werden nicht übernommen.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.