Anleitungen

Docker-Container löschen, Images entfernen und Docker aufräumen: stop, rm, rmi und prune

Docker-Container löschen mit docker rm, Docker-Images löschen mit docker rmi, Docker aufräumen mit prune und system df. Plus der Fehler „image is being used“.

Veröffentlicht ~11 Min. Lesezeit
Auf dieser Seite

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.

jedes System mit Docker
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 kann

Befehle 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

AufgabeBefehl
Einen Container stoppendocker stop web
Alle laufenden Container stoppendocker stop $(docker ps -q)
Einen Container beenden, der nicht stopptdocker kill web
Einen gestoppten Container löschendocker rm web
Stoppen und löschen in einem Schrittdocker rm -f web
Einen Container samt anonymen Volumes löschendocker rm -v web
Alle gestoppten Container löschendocker container prune
Alle Container löschen, laufend oder nichtdocker ps -aq | xargs -r docker rm -f
Ein Image löschendocker rmi nginx:1.27
Dangling Images löschendocker image prune
Jedes Image löschen, das kein Container nutztdocker image prune -a
Ein Volume löschendocker volume rm pgdata
Ungenutzte Volumes löschen, benannte eingeschlossendocker volume prune -a
Alles Ungenutzte auf einmal entfernendocker system prune
Ein Compose-Projekt samt Images und Volumes entfernendocker compose down --rmi all -v
Sehen, was den Platz belegtdocker 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

jedes System mit Docker
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 SIGKILL

docker 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:

jedes System mit Docker
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' web
docker update --restart=no web
docker stop web

Docker-Container löschen: docker rm

docker rm löscht gestoppte Container, beliebig viele auf einmal. Bei einem laufenden verweigert es:

Beispielausgabe · docker rm web, während web läuft
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.

jedes System mit Docker · in großer Zahl löschen
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 nicht

xargs -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

jedes System mit Docker
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 einmal

Lö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:

Beispielausgabe · docker rmi myapp:1.0
Error response from daemon: conflict: unable to remove repository reference "myapp:1.0" (must force) - container 0b3a2c9d1e4f is using its referenced image 2d4ba2b1a9d0
Beispielausgabe · docker rmi 2d4ba2b1a9d0
Error response from daemon: conflict: unable to delete 2d4ba2b1a9d0 (must be forced) - image is being used by stopped container 0b3a2c9d1e4f

Such alle Container, die aus dem Image erstellt wurden, lösch sie und danach das Image:

jedes System mit Docker
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

jedes System mit Docker
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 Image

Die 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 ImageUngenutztes Image
Was es istEin 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 entstehtNeu bauen oder pullen verschiebt den Tag auf das neue Image und lässt das alte ohne Tag zurückDu hast es gepullt oder gebaut, und gerade läuft nichts davon
Entfernt durchdocker image prunedocker image prune -a
RisikoPraktisch keinesDas Image muss vor der nächsten Nutzung neu gepullt oder gebaut werden
jedes System mit Docker
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ählt
Beispielabfrage · docker image prune -a
WARNING! 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.

jedes System mit Docker
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 Volumes

Seit 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

jedes System mit Docker
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-Cache
Beispielausgabe · docker system df
TYPE            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.6GB
Beispielabfrage · docker system prune
WARNING! 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

im Ordner mit compose.yaml
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 stehen

down -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 prune und docker 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

MeldungUrsacheLösung
container is running: stop the container before removing or force removedocker rm auf einen laufenden ContainerErst docker stop, oder docker rm -f
unable to remove repository reference ... container ... is using its referenced imageEin Container, gestoppt oder laufend, wurde aus dem Image erstelltdocker ps -a --filter ancestor=IMAGE, diese löschen, dann rmi
image is being used by stopped containerDasselbe, mit dem Image per ID angegebenZuerst den Container löschen
(cannot be forced) - image is being used by running containerEin laufender Container nutzt esDiesen Container stoppen und löschen
image is referenced in multiple repositoriesDie ID hat mehrere TagsJeden Tag entfernen, oder docker rmi -f ID
volume is in useEin Container, auch ein gestoppter, verweist noch auf das VolumeErst den Container löschen, dann das Volume
No such containerTippfehler, 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.