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.