2. Docker

2.4. Eliminar imatges i contenidors Docker

Sempre és recomanable mantenir una bona gestió d’imatges i contenidors, ja que, si no s’utilitzen, van ocupant espai de manera innecessària. Així, aprendrem a eliminar imatges i contenidors.

Per poder eliminar imatges, necessitarem saber la Image ID. Per a això, utilitzarem la següent ordre:

$ docker image ls

Ens apareixerà un output similar al següent:

Taula 1.

REPOSITORY        TAG IMAGE ID      CREATED        SIZE
alpine latest 9ed4aefc74f6 10 days ago 7.05MB
hello-world latest feb5d9fea6a5 18 months ago 13.3kB

Font: elaboració pròpia.

Així, per eliminar una imatge simplement s’ha d’especificar la Image ID:

$ docker image rm feb5d9fea6a5

O emprant el seu nom:

$ docker image rm hello-world

Moltes vegades ens podem trobar amb un missatge d’error:

Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) – image is being used by stopped container 06dda9650983

Això ens està indicant que hi ha un contenidor que encara està actiu, que encara no ha estat netejat o que està o ha fet ús d’aquesta imatge. Per això, primer hem d’eliminar els contenidors que estan impedint l’eliminació d’aquesta imatge.

Primer llistem els contenidors actius:

$ docker container ls

O, de manera similar, podem utilitzar:

$ docker ps

És possible que no ens retorni cap contenidor actiu. En realitat, el missatge d’error previ ens indicava que el contenidor s’havia aturat; per tant, té sentit que no trobem el contenidor en aquest llistat. Així, necessitarem veure tant els contenidors actius com els que recentment s’han aturat:

$ docker container ls –all

Aquí sí que podem veure el contenidor anteriorment especificat com a enllaçat a «hello-world»:

Taula 2.

CONTAINER ID   IMAGE                  COMMAND                  CREATED  STATUS PORTS  NAMES
8a149fe84874 alpine “sh” About an hour ago Exited xenodochial_thompson
06dda9650983 hello-world “/hello” 12 hours ago Exited upbeat_satoshi

Font: elaboració pròpia.

Per evitar que es vagin acumulant els contenidors, es pot afegir a l’ordre run una opció d’eliminar automàticament un cop finalitzat:

$ docker container run --rm hello-world

Si no hem especificat l’opció rm, l’hem d’eliminar manualment utilitzant com a referència el Container ID:

$ docker container rm 06dda9650983

Si s’elimina correctament, ens retornarà el Container ID al terminal. Es pot esborrar més d’un Container ID simultàniament.

Si tenim diversos contenidors associats a una imatge i volem esborrar-los tots utilitzant un patró podem:

$ docker container ps -a | grep "world" | awk '{print $1}' | xargs docker rm

En aquest cas, utilitzem l’ordre xargs per controlar una llista d’arguments per poder ser eliminats mitjançant rm de Docker.

Ara veurem que, quan llistem els contenidors, ja no apareix el contenidor i, si provem d’eliminar la imatge com prèviament havíem intentat, ho farà sense problemes.

$ docker image rm hello-world
$ docker image ls

Si es volen eliminar tots els contenidors existents, podem utilitzar:

$ docker container prune

D’aquesta manera tots els contenidors existents seran eliminats i, si volem tornar a reconnectar-los, haurem d’iniciar-los de nou.