Speicherplatz in Docker verwalten - wenn die Festplatte voll ist
Speicherplatz in Docker verwalten - wenn die Festplatte voll ist
Docker sammelt still und heimlich Gigabytes an – gestoppte Container, verwaiste Images, vergessene Volumes. Hier ist der systematische Weg raus.
Überblick verschaffen
Bevor man wild löscht, erstmal schauen was Platz verbraucht:
docker system df
Ausgabe:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 23 5 8.2GB 6.1GB (74%)
Containers 12 3 245MB 201MB (82%)
Local Volumes 8 4 3.4GB 1.2GB (35%)
Build Cache 47 0 1.8GB 1.8GB
Detailliertere Ansicht:
docker system df -v
Die Haupttäter
Gestoppte Container: Werden nach docker stop nicht automatisch gelöscht. Jeder enthält einen beschreibbaren Layer.
Dangling Images: Images ohne Tag – entstehen beim Rebuild wenn der alte Image-Name auf ein neues Image zeigt.
# Nur dangling Images anzeigen
docker images -f dangling=true
Ungenutzte Volumes: Named Volumes ohne zugehörigen Container bleiben für immer liegen.
Log-Dateien: Der JSON-File-Log-Treiber schreibt ohne Limit. Auf viel genutzten Systemen wird /var/lib/docker/containers/*/ schnell gigabytes groß.
# Größte Log-Dateien finden
find /var/lib/docker/containers/ -name "*.log" -exec du -sh {} \; | sort -rh | head -20
Chirurgisches Vorgehen
Lieber gezielt löschen als alles auf einmal:
# Gestoppte Container löschen
docker container prune
# Dangling Images löschen (nur ungetaggte)
docker image prune
# Alle nicht verwendeten Images löschen (auch getaggte ohne Container)
docker image prune -a
# Unbenutzte Volumes löschen
docker volume prune
# Build Cache leeren
docker builder prune
Die Atombombe
Alles auf einmal – gestoppte Container, alle unbenutzten Images, ungenutzte Volumes, Build Cache:
docker system prune -a --volumes
Achtung: --volumes löscht auch Named Volumes ohne laufenden Container. Daten weg = Daten weg. Vorher prüfen:
docker volume ls
docker ps -a # welche Container sind gestoppt aber haben Volumes?
Log-Rotation dauerhaft einrichten
Die nachhaltigere Lösung: Docker so konfigurieren dass Logs gar nicht erst unbegrenzt wachsen.
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Nach der Änderung:
systemctl restart docker
Bestehende Container übernehmen die neue Konfiguration erst nach docker compose up -d (Container werden neu erstellt).
Images nach Größe sortieren
docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -rh | head -20
Automatische Bereinigung
Für regelmäßige Säuberung einen Cron-Job anlegen:
# Täglich um 3 Uhr morgens: alles älter als 7 Tage bereinigen
0 3 * * * docker image prune -a --filter "until=168h" -f >> /var/log/docker-prune.log 2>&1
Der --filter until=168h verhindert, dass aktiv genutzte Images gelöscht werden die zufällig gerade keinen Container haben.