Kurz gesagt: Einen Docker-Container löschen heißt: ihn mit docker stop NAME stoppen und mit docker rm NAME entfernen, oder beides auf einmal mit docker rm -f NAME. Ein Docker-Image löschst du mit docker rmi IMAGE, sobald kein Container es mehr nutzt. Zum Docker-Aufräumen entfernen docker container prune, docker image prune -a und docker volume prune alles Ungenutzte, und docker system df zeigt den belegten Platz.
docker stop web # den Container namens web stoppen
docker rm web # ihn löschen (er muss gestoppt sein)
docker rmi nginx:1.27 # das Image löschen, sobald kein Container es nutzt
docker system df # wie viel Platz Docker belegt und wie viel frei werden kannBefehle und Meldungen folgen hier der CLI-Referenz von Docker auf docs.docker.com. Docker wurde für diesen Artikel nicht ausgeführt, die Ausgabeblöcke sind also Beispiele für das Format; Container-IDs und Größen sehen auf deiner Maschine anders aus, und bei Installationen mit dem containerd Image Store können manche Fehlermeldungen anders formuliert sein.
Spickzettel: stoppen und löschen
| Aufgabe | Befehl |
|---|---|
| Einen Container stoppen | docker stop web |
| Alle laufenden Container stoppen | docker stop $(docker ps -q) |
| Einen Container beenden, der nicht stoppt | docker kill web |
| Einen gestoppten Container löschen | docker rm web |
| Stoppen und löschen in einem Schritt | docker rm -f web |
| Einen Container samt anonymen Volumes löschen | docker rm -v web |
| Alle gestoppten Container löschen | docker container prune |
| Alle Container löschen, laufend oder nicht | docker ps -aq | xargs -r docker rm -f |
| Ein Image löschen | docker rmi nginx:1.27 |
| Dangling Images löschen | docker image prune |
| Jedes Image löschen, das kein Container nutzt | docker image prune -a |
| Ein Volume löschen | docker volume rm pgdata |
| Ungenutzte Volumes löschen, benannte eingeschlossen | docker volume prune -a |
| Alles Ungenutzte auf einmal entfernen | docker system prune |
| Ein Compose-Projekt samt Images und Volumes entfernen | docker compose down --rmi all -v |
| Sehen, was den Platz belegt | docker system df |
docker rm ist die Kurzform von docker container rm, docker rmi die von docker image rm; beide Schreibweisen tun dasselbe. Wo ein Befehl einen Container erwartet, funktionieren der Name, die volle ID oder jeder eindeutige Anfang der ID: docker ps -a zeigt alle drei.
Einen Container stoppen: docker stop und docker kill
docker stop web # SIGTERM, nach 10 Sekunden SIGKILL
docker stop -t 60 web # einer Datenbank eine Minute zum sauberen Beenden geben
docker stop $(docker ps -q) # alle laufenden Container
docker kill web # sofort SIGKILLdocker stop schickt dem Hauptprozess des Containers SIGTERM (oder das Signal, das das Image mit STOPSIGNAL festlegt), wartet standardmäßig 10 Sekunden und schickt dann SIGKILL. Braucht ein Container jedes Mal die vollen 10 Sekunden, läuft sein Programm meist unter einer Shell, die das Signal nicht weiterreicht. docker kill spart sich das Warten; nimm es für einen Container, der hängt, nicht als normalen Weg, eine Datenbank zu stoppen. In einem Compose-Projekt stoppt docker compose stop alle Dienste des Projekts.
Der Container ist nach einem Neustart wieder da
Das ist seine Restart-Policy. Ein Container, der mit --restart always gestartet wurde, bleibt nach docker stop zwar gestoppt, aber Docker startet ihn wieder, sobald der Daemon neu startet, und das passiert bei jedem Neustart des Servers. unless-stopped merkt sich, dass du ihn gestoppt hast. Ändere die Policy am bestehenden Container oder lösch den Container:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' web
docker update --restart=no web
docker stop webDocker-Container löschen: docker rm
docker rm löscht gestoppte Container, beliebig viele auf einmal. Bei einem laufenden verweigert es:
Error response from daemon: cannot remove container "/web": container is running: stop the container before removing or force removeÄltere Engine-Versionen formulieren es als You cannot remove a running container ... Stop the container before attempting removal or force remove. Stopp ihn entweder vorher oder nimm -f: Das beendet ihn mit SIGKILL und löscht ihn in einem Schritt, ohne das saubere Herunterfahren, das docker stop erlauben würde. Was mit dem Container verschwindet: seine beschreibbare Schicht (jede Datei, die er außerhalb eines Volumes geändert oder angelegt hat), sein Log und sein Name, der für einen neuen Container frei wird. Was bleibt: das Image, benannte Volumes und per Bind Mount eingebundene Ordner auf dem Host. -v löscht zusätzlich die anonymen Volumes des Containers, mehr dazu weiter unten.
docker container prune # alle gestoppten Container, fragt vorher
docker container prune --filter "until=24h" # nur die, die vor über 24 Stunden erstellt wurden
docker ps -aq --filter status=exited | xargs -r docker rm # dasselbe von Hand
docker ps -aq | xargs -r docker rm -f # alle Container, laufend oder nichtxargs -r führt nichts aus, wenn die Liste leer ist, während docker rm $(docker ps -aq) sich dann beschwert, dass es mindestens ein Argument braucht. Ein Container, der mit docker run --rm gestartet wurde, löscht sich beim Beenden selbst, so stapeln sich Einmal-Container gar nicht erst.
Docker-Image löschen: docker rmi
docker images # auflisten, mit Name, Tag, ID und Größe
docker rmi nginx:1.27 # nach Name und Tag
docker rmi 605c77e624dd # nach ID
docker image rm myapp:old myapp:older # mehrere auf einmalLöschen nach Name und Tag entfernt zuerst diesen Tag. Hat dasselbe Image weitere Tags, verschwindet nur der Tag (Untagged: myapp:old), und das Image bleibt für die anderen; ist der letzte Tag weg, werden auch seine Schichten gelöscht (Deleted: sha256:...). Schichten, die ein anderes Image mitbenutzt, bleiben auf der Platte, bis kein Image sie mehr braucht.
„Image is being used by stopped container“
Docker löscht kein Image, aus dem irgendein Container erstellt wurde, auch kein gestoppter, weil der Container die Schichten des Images braucht, um wieder zu starten. Die Meldung hängt davon ab, ob du das Image per Tag oder per ID angegeben hast:
Error response from daemon: conflict: unable to remove repository reference "myapp:1.0" (must force) - container 0b3a2c9d1e4f is using its referenced image 2d4ba2b1a9d0Error response from daemon: conflict: unable to delete 2d4ba2b1a9d0 (must be forced) - image is being used by stopped container 0b3a2c9d1e4fSuch alle Container, die aus dem Image erstellt wurden, lösch sie und danach das Image:
docker ps -a --filter ancestor=myapp:1.0
docker rm 0b3a2c9d1e4f
docker rmi myapp:1.0-f ist hier nicht die Abkürzung, nach der es aussieht: docker rmi -f entfernt den Tag, aber das Image bleibt als ungetaggtes <none>-Image auf der Platte, solange der gestoppte Container existiert. Gegen einen laufenden Container stoppt sogar -f mit (cannot be forced) - image is being used by running container. Die dritte häufige Ablehnung, (must be forced) - image is referenced in multiple repositories, bedeutet, dass die angegebene ID mehrere Tags hat; entferne die Tags einzeln, oder nimm -f mit der ID, um alle zu entfernen.
Alle Docker-Images löschen
docker image prune -a # jedes Image, das kein Container nutzt (fragt vorher)
docker ps -aq | xargs -r docker rm -f # oder, für einen kompletten Neuanfang: erst alle Container,
docker images -aq | xargs -r docker rmi -f # dann jedes ImageDie erste Zeile ist das, was die meisten wollen: Sie behält die Images, die deine Container, gestoppte eingeschlossen, noch brauchen. Die beiden letzten löschen alles, danach muss jeder Dienst sein Image erst wieder pullen oder bauen, bevor er starten kann.
Dangling oder ungenutzt: docker image prune
| Dangling Image | Ungenutztes Image | |
|---|---|---|
| Was es ist | Ein Image ohne Tag, auf das kein Container verweist, angezeigt als <none>:<none> | Jedes Image, mit oder ohne Tag, aus dem kein Container (laufend oder gestoppt) erstellt wurde |
| Wie es entsteht | Neu bauen oder pullen verschiebt den Tag auf das neue Image und lässt das alte ohne Tag zurück | Du hast es gepullt oder gebaut, und gerade läuft nichts davon |
| Entfernt durch | docker image prune | docker image prune -a |
| Risiko | Praktisch keines | Das Image muss vor der nächsten Nutzung neu gepullt oder gebaut werden |
docker images -f dangling=true # Dangling Images auflisten
docker image prune # sie entfernen
docker image prune -a --filter "until=168h" # ungenutzte Images, älter als 7 Tage
docker builder prune # den Build-Cache, der separat zähltWARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]Mit -f entfällt die Rückfrage, praktisch für Skripte und Cronjobs. Der Build-Cache, den docker build auf einer Maschine füllt, die Images baut, ist kein Image und wird von docker builder prune oder von docker system prune geleert.
Volumes löschen und die Falle mit dem Datenverlust
Ein Volume hält Daten außerhalb der beschreibbaren Schicht des Containers, deshalb übersteht es docker rm. Es gibt zwei Arten. Ein benanntes Volume hat einen Namen von dir, etwa -v pgdata:/var/lib/postgresql/data. Ein anonymes Volume bekommt einen zufälligen Namen aus 64 Zeichen. Docker legt eines an, wenn ein Image ein VOLUME deklariert und du dort beim Start nichts einhängst, und wenn du -v nur mit einem Pfad im Container angibst, etwa -v /data.
docker volume ls # alle Volumes
docker volume ls -f dangling=true # Volumes, auf die kein Container verweist
docker volume rm pgdata # eines löschen
docker volume prune # ungenutzte anonyme Volumes
docker volume prune -a # auch ungenutzte benannte VolumesSeit Docker Engine 23.0 entfernt docker volume prune nur ungenutzte anonyme Volumes; erst -a (--all) schließt benannte ein, und ältere Anleitungen, die etwas anderes sagen, stammen aus der Zeit vor dieser Änderung. Ein Volume, das noch an einem Container hängt, auch an einem gestoppten, wird mit remove pgdata: volume is in use - [0b3a2c9d1e4f...] abgelehnt: Lösch zuerst den Container.
Docker aufräumen: docker system prune und docker system df
docker system df # Summen pro Typ
docker system df -v # pro Image, Container und Volume
docker system prune # gestoppte Container, ungenutzte Netzwerke, Dangling Images, Build-CacheTYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 14 4 6.21GB 4.87GB (78%)
Containers 6 4 212MB 38MB (17%)
Local Volumes 9 3 2.3GB 1.1GB (47%)
Build Cache 41 0 1.6GB 1.6GBWARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- unused build cache
Are you sure you want to continue? [y/N]-a erweitert „dangling images“ auf jedes Image ohne Container und leert den gesamten Build-Cache. --volumes nimmt ungenutzte anonyme Volumes dazu, mit der Warnung von oben; benannte Volumes lässt docker system prune aus, die entfernst du mit docker volume rm oder docker volume prune -a. RECLAIMABLE in docker system df ist der Platz, den Objekte belegen, die gerade von nichts genutzt werden.
Ein Docker-Compose-Projekt entfernen
docker compose down # Container und Netzwerke; Volumes und Images bleiben
docker compose down -v # auch die benannten und anonymen Volumes des Projekts
docker compose down --rmi all # auch jedes Image, das die Dienste nutzen
docker compose down --rmi local -v # hier gebaute Images (ohne image:-Namen) und Volumes
docker compose down --remove-orphans # auch Container von Diensten, die nicht mehr in der Datei stehendown -v löscht die benannten Volumes aus dem Abschnitt volumes: der Datei, und dort liegt meist die Datenbank; Volumes mit external: true bleiben unangetastet. Weitere Compose-Befehle stehen im Docker-Befehle-Spickzettel (engl.).
Wenn die Platte voll ist
Auf einem Server kommen diese Befehle meist ins Spiel, weil die Platte vollgelaufen ist. Geh der Reihe nach vor, das Sicherste zuerst:
docker system df, um zu sehen, ob Images, Container, Volumes oder der Build-Cache das Problem sind.docker image prune,docker builder pruneunddocker container prune: schnell freier Platz bei geringem Risiko.docker image prune -a, wenn sich nach jedem Deploy alte Image-Versionen stapeln.- Große Container-Logs: Das Log eines Containers wird mit dem Container gelöscht, und Log-Rotation hält das nächste klein, eingerichtet wie in Docker unter Ubuntu und Debian installieren beschrieben.
Lösch nie Ordner unter /var/lib/docker von Hand: Dann passen die eigenen Aufzeichnungen von Docker über Images und Schichten nicht mehr zur Platte, und die Prune-Befehle können nicht mehr aufräumen. Liegt es gar nicht an Docker, hilft No space left on device (engl.) dabei herauszufinden, was die Platte sonst füllt. Und fehlt docker selbst auf der Maschine, lies docker: command not found (engl.).
Fehler beim Stoppen und Löschen
| Meldung | Ursache | Lösung |
|---|---|---|
container is running: stop the container before removing or force remove | docker rm auf einen laufenden Container | Erst docker stop, oder docker rm -f |
unable to remove repository reference ... container ... is using its referenced image | Ein Container, gestoppt oder laufend, wurde aus dem Image erstellt | docker ps -a --filter ancestor=IMAGE, diese löschen, dann rmi |
image is being used by stopped container | Dasselbe, mit dem Image per ID angegeben | Zuerst den Container löschen |
(cannot be forced) - image is being used by running container | Ein laufender Container nutzt es | Diesen Container stoppen und löschen |
image is referenced in multiple repositories | Die ID hat mehrere Tags | Jeden Tag entfernen, oder docker rmi -f ID |
volume is in use | Ein Container, auch ein gestoppter, verweist noch auf das Volume | Erst den Container löschen, dann das Volume |
No such container | Tippfehler, oder er wurde schon gelöscht (--rm) | docker ps -a für den genauen Namen |
Häufige Fragen
Wie lösche ich einen Docker-Container?
Stopp ihn mit docker stop NAME und lösch ihn dann mit docker rm NAME, oder beides auf einmal mit docker rm -f NAME. docker ps -a listet jeden Container mit Name und ID. Beim Löschen verschwinden seine beschreibbare Schicht und sein Log; Image, benannte Volumes und per Bind Mount eingebundene Ordner bleiben.
Wie lösche ich alle Docker-Images?
docker image prune -a entfernt jedes Image, aus dem kein Container, laufend oder gestoppt, erstellt wurde. Um wirklich alles zu löschen, entfernst du zuerst die Container mit docker ps -aq | xargs -r docker rm -f und dann die Images mit docker images -aq | xargs -r docker rmi -f. Danach muss jeder Dienst sein Image neu pullen oder bauen.
Löscht docker system prune auch Volumes?
Standardmäßig nicht. docker system prune entfernt gestoppte Container, ungenutzte Netzwerke, Dangling Images und Build-Cache. Mit --volumes kommen ungenutzte anonyme Volumes dazu, in denen die Daten einer Datenbank liegen können. Benannte Volumes brauchen docker volume rm, docker volume prune -a oder, bei einem Compose-Projekt, docker compose down -v.