Docker prune richtig nutzen: Container, Images und Volumes aufräumen

Mit docker prune entfernst du ungenutzte Container, Images und Volumes und schaffst wieder freien Speicher. Inklusive Beispiele und Best Practices für echte Projekte.

Bernd Fischer

Bernd Fischer

01. Nov 2024 · 4 Minuten Lesezeit

Docker prune richtig nutzen: Container, Images und Volumes aufräumen

Übersicht über prune

Mit den verschiedenen docker prune-Befehlen lassen sich ungenutzte Docker-Ressourcen gezielt entfernen. Dazu gehören gestoppte Container, nicht mehr referenzierte Images, ungenutzte Netzwerke und – je nach Befehl – auch Volumes.

Gerade auf Entwicklungsrechnern oder Build-Systemen sammeln sich solche Ressourcen mit der Zeit an. Bevor Du jedoch einfach alles entfernst, solltest Du zuerst prüfen, wo Docker tatsächlich Speicher belegt:

docker system df

Damit bekommst Du einen Überblick über Images, Container, Volumes und Build-Cache.

prune ist anschließend ein Werkzeug zum Aufräumen – nicht zur Diagnose.


Entfernen gestoppter Container

Gestoppte Container bleiben nach ihrer Ausführung bestehen und können weiterhin Speicher belegen.

Mit folgendem Befehl entfernst Du alle gestoppten Container:

docker container prune

Docker zeigt vor dem Löschen eine Warnung und fragt nach einer Bestätigung.

Falls Du die Rückfrage bewusst überspringen möchtest:

docker container prune --force

Laufende Container werden dabei nicht entfernt.

Vorher kannst Du Dir ansehen, welche gestoppten Container überhaupt vorhanden sind:

docker ps -a

So weißt Du, was der Cleanup tatsächlich betrifft.


Entfernen ungenutzter Volumes

Volumes speichern Daten unabhängig vom Lebenszyklus eines Containers. Genau das macht sie nützlich – und gleichzeitig gefährlich beim unbedachten Aufräumen.

Nicht mehr verwendete Volumes lassen sich mit folgendem Befehl entfernen:

docker volume prune

Ohne Rückfrage:

docker volume prune --force

Bevor Du Volumes löschst, solltest Du prüfen, welche vorhanden sind:

docker volume ls

Ein einzelnes Volume kannst Du genauer untersuchen:

docker volume inspect <volume-name>

Wichtig: Ein Volume kann Daten enthalten, die Du später noch brauchst, auch wenn aktuell kein Container darauf zugreift.


Entfernen nicht referenzierter Images

Docker speichert Images und Image-Layer lokal. Besonders nach häufigen Builds können sich viele alte oder nicht mehr referenzierte Images ansammeln.

Mit:

docker image prune

entfernst Du standardmäßig sogenannte dangling Images.

Ohne Rückfrage:

docker image prune --force

Wenn Du zusätzlich alle aktuell nicht verwendeten Images entfernen möchtest:

docker image prune --all

Das ist deutlich aggressiver.

Vorher lohnt sich ein Blick auf die vorhandenen Images:

docker image ls

So kannst Du besser einschätzen, ob Du nur Build-Reste entfernst oder auch Images, die Du später wieder benötigen könntest.


Entfernen ungenutzter Netzwerke

Docker Compose und manuell gestartete Container erzeugen häufig eigene Netzwerke.

Ungenutzte Netzwerke lassen sich entfernen mit:

docker network prune

Oder ohne Rückfrage:

docker network prune --force

Welche Netzwerke aktuell existieren, zeigt:

docker network ls

Entfernt werden nur Netzwerke, die aktuell nicht von Containern verwendet werden.


Mehrere ungenutzte Ressourcen auf einmal entfernen

Mit:

docker system prune

räumt Docker mehrere Ressourcentypen gleichzeitig auf.

Dazu gehören unter anderem:

  • gestoppte Container
  • ungenutzte Netzwerke
  • dangling Images
  • Teile des Build-Caches

Volumes bleiben standardmäßig erhalten.

Mit:

docker system prune --all

werden zusätzlich alle nicht verwendeten Images entfernt.

Noch aggressiver ist:

docker system prune --all --volumes

Damit werden auch ungenutzte Volumes einbezogen.

Vorsicht:
docker system prune --all --volumes sollte nicht als reflexartige Standardlösung verwendet werden. Prüfe vorher, welche Images und Volumes noch gebraucht werden und ob dort relevante Daten liegen.


Beispiel aus der Praxis

Angenommen, docker system df zeigt:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          18        3         12.4GB    8.7GB
Containers      9         2         1.1GB     860MB
Local Volumes   7         4         5.6GB     1.2GB
Build Cache     42        0         9.3GB     9.3GB

Dann ist es sinnvoller, nicht sofort alles zu löschen, sondern gezielt vorzugehen.

Zuerst könnten gestoppte Container entfernt werden:

docker container prune

Danach nicht mehr benötigte Images:

docker image prune

Falls der Build-Cache der größte Speicherfresser ist:

docker builder prune

Volumes würde ich erst dann anfassen, wenn klar ist, welche Daten darin liegen.

Genau dieser Unterschied ist wichtig:

Diagnose
    ↓
betroffene Ressource finden
    ↓
gezielt aufräumen
    ↓
erneut prüfen

statt:

Speicher knapp
    ↓
alles löschen

Docker-Probleme systematisch untersuchen

prune hilft beim Aufräumen. Es erklärt aber nicht, warum Docker überhaupt so viel Speicher belegt oder warum bestimmte Ressourcen immer wieder entstehen.

Dasselbe gilt für viele andere Docker-Probleme: Container beenden sich sofort, Ports sind nicht erreichbar, Daten scheinen verschwunden zu sein oder ein Build wird plötzlich langsam.

Wenn Du solche Probleme nicht nur beheben, sondern systematisch diagnostizieren möchtest, findest Du in meinem Buch Docker Troubleshooting 20 praktische Diagnose- und Reparaturrezepte für Entwickler.

Behandelt werden unter anderem:

  • Speicherverbrauch durch Images, Container, Volumes und Build-Cache
  • Logs, Exit Codes und Healthchecks
  • Netzwerkprobleme mit Docker Compose
  • Ports, Listener und Readiness
  • Volumes, Bind Mounts und Dateirechte
  • .env, Container-Environment und Build-Secrets
  • langsame Builds, Cache-Invalidierung und Image-Layer

Mehr zum Buch


Docker ist nur ein Teil der Lösung

Cleanup-Befehle helfen dabei, angesammelte Ressourcen zu entfernen. In realen Projekten entstehen Probleme jedoch oft durch die Struktur des gesamten Systems: unklare Deployments, schlecht getrennte Services oder uneinheitliche Build- und Laufzeitprozesse.

Gerade bei Django-Projekten lohnt es sich deshalb, nicht nur Docker selbst zu betrachten, sondern auch die Architektur der Anwendung.

Wenn Dich interessiert, wie ein wartbares Django-Projekt aufgebaut sein kann, findest Du hier eine ausführliche Erklärung:

Wie ein wartbares Django-Projekt aufgebaut ist