Ja saps què és Docker, el tens instal·lat i n'entens l'arquitectura. Toca aprendre a parlar-hi. La bona notícia és que la CLI de Docker no és una col·lecció arbitrària de comandes que calgui memoritzar: està organitzada seguint exactament els quatre tipus d'objecte que vas veure a la lliçó anterior, amb una gramàtica regular i predictible. Si entens aquesta gramàtica, dedueixes la majoria de les comandes sense consultar-les. En aquesta lliçó veuràs l'anatomia de la CLI moderna i els seus àlies històrics, el sistema d'ajuda integrat (que és la teva millor referència i sempre està actualitzat), les comandes essencials sobre imatges, contenidors i sistema, una sessió completa comentada de principi a fi, i com domar la sortida amb --format i --filter perquè et doni exactament el que necessites.

Contingut

  1. L'anatomia de la CLI moderna
  2. Àlies curts: la sintaxi històrica
  3. El sistema d'ajuda
  4. Comandes essencials sobre imatges
  5. Comandes essencials sobre contenidors
  6. Comandes de sistema
  7. Una sessió completa comentada
  8. Formatar la sortida amb --format
  9. Filtrar la sortida amb --filter

  1. L'anatomia de la CLI moderna

La CLI moderna de Docker segueix una estructura de tres peces:

docker <objecte> <acció> [opcions] [arguments]
  • objecte: sobre quin tipus de cosa actues. Són els del daemon: image, container, volume, network, més alguns de gestió (system, context, builder).
  • acció: què li fas. El vocabulari es repeteix entre objectes: ls, rm, inspect, prune, create.
  • opcions i arguments: modificadors i l'objecte concret.

Exemples que il·lustren la regularitat:

docker container ls
docker image ls
docker volume ls
docker network ls

Tots quatre llisten; només canvia el tipus. I el mateix amb esborrar:

docker container rm el-meu-contenidor
docker image rm nginx:alpine
docker volume rm dades-aurora
docker network rm xarxa-aurora

Aquesta taula d'accions comunes val per a gairebé tots els objectes:

Acció Què fa Exemple
ls Llista els objectes existents docker image ls
inspect Mostra totes les metadades en JSON docker container inspect web
rm Elimina un objecte o diversos docker volume rm dades
prune Elimina tots els objectes no utilitzats d'aquest tipus docker image prune
create Crea l'objecte sense arrencar-lo docker network create xarxa-aurora

La conclusió pràctica: no memoritzis comandes, memoritza la gramàtica. Si necessites llistar volums i no ho has fet mai, docker volume ls és l'aposta òbvia i és correcta.

  1. Àlies curts: la sintaxi històrica

Abans de la reorganització per objectes, les comandes eren planes: docker ps, docker images, docker rmi. Docker les va mantenir per compatibilitat, i a la pràctica tothom les continua fent servir perquè s'escriuen menys. Veuràs les dues formes constantment, en documentació i en el treball real.

Àlies curt Forma moderna equivalent Què fa
docker ps docker container ls Llista contenidors en execució
docker ps -a docker container ls -a Llista tots els contenidors, també els aturats
docker images docker image ls Llista imatges locals
docker rmi docker image rm Elimina imatges
docker pull docker image pull Descarrega una imatge del registre
docker push docker image push Puja una imatge al registre
docker run docker container run Crea i arrenca un contenidor
docker start docker container start Arrenca un contenidor aturat
docker stop docker container stop Atura un contenidor en execució
docker restart docker container restart Atura i arrenca de nou
docker rm docker container rm Elimina contenidors
docker logs docker container logs Mostra la sortida del contenidor
docker exec docker container exec Executa una comanda dins d'un contenidor
docker inspect docker container inspect / docker image inspect Metadades en JSON
docker build docker buildx build Construeix una imatge

Un parell d'advertiments sobre la taula:

  • docker rm i docker rmi s'assemblen perillosament. rm esborra contenidors; rmi esborra imatges. Una lletra de diferència i conseqüències molt diferents.
  • docker inspect sense objecte és ambigu: busca primer un contenidor amb aquest nom o ID i, si no el troba, una imatge. Quan vulguis certesa, fes servir la forma llarga.
  • docker build davant de docker buildx build: en versions actuals, docker build ja fa servir BuildKit per sota. La forma explícita docker buildx build és la recomanada el 2026 i la que farem servir a partir del mòdul 2.

Recomanació per a aquest curs: entén la forma llarga, fes servir la curta. Escriure docker ps és perfectament professional; el que no és professional és no saber que equival a docker container ls.

  1. El sistema d'ajuda

La CLI de Docker documenta cada comanda i cada opció. Aquesta ajuda sempre està sincronitzada amb la teva versió instal·lada, cosa que cap web no garanteix.

docker --help

Mostra els grups de comandes per objecte (Management Commands) i les comandes soltes (Commands), que són els àlies de l'apartat anterior.

docker container --help

Llista totes les accions disponibles sobre contenidors: attach, commit, cp, create, diff, exec, export, inspect, kill, logs, ls, pause, port, prune, rename, restart, rm, run, start, stats, stop, top, unpause, update, wait.

docker container run --help

Aquí hi ha el detall de cada opció. És una sortida llarguíssima —run té desenes d'opcions— i per això convé filtrar-la:

docker run --help | grep -i publish
  -p, --publish list       Publish a container's port(s) to the host
  -P, --publish-all        Publish all exposed ports to random ports

Què fa aquesta comanda: encadena l'ajuda a grep -i (cerca ignorant majúscules) per quedar-te amb les línies que esmenten "publish". És la manera més ràpida de recordar una opció la lletra de la qual has oblidat.

Dues comandes més de referència:

docker version
docker system info

Ja les coneixes; docker system info és simplement la forma llarga de docker info, i confirma que info també encaixa en la gramàtica objecte-acció.

  1. Comandes essencials sobre imatges

Comanda Què fa Exemple
docker pull <imatge> Descarrega una imatge del registre docker pull nginx:alpine
docker images Llista les imatges locals docker images
docker rmi <imatge> Elimina una imatge local docker rmi nginx:alpine
docker image prune Esborra imatges "penjades" (sense etiqueta) docker image prune
docker search <terme> Busca imatges a Docker Hub docker search postgres

Vegem-les en acció:

docker pull alpine:3.20
3.20: Pulling from library/alpine
f18232174bc9: Pull complete
Digest: sha256:1e42bbe2508154c9126d48c2b8a75420c3544343bf86fd041fb7527e017a4b4a
Status: Downloaded newer image for alpine:3.20
docker.io/library/alpine:3.20

Ja saps llegir això de la lliçó 01-02: una capa descarregada, el digest que identifica la imatge de manera immutable, i a l'última línia el nom complet que Docker ha resolt (docker.io/library/alpine:3.20), confirmant el que vas veure sobre registres per defecte.

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         alpine    3f8a4339aadd   2 days ago     52.5MB
alpine        3.20      a8560b36e8b8   3 weeks ago    8.83MB
hello-world   latest    d2c94e258dcb   9 months ago   13.3kB

Columna a columna:

  • REPOSITORY: el nom del repositori de la imatge.
  • TAG: l'etiqueta, la "versió". latest és només un nom d'etiqueta més (lliçó 01-05).
  • IMAGE ID: identificador curt (els primers 12 caràcters del digest). És el que faràs servir per referir-te a la imatge quan no tingui nom.
  • CREATED: quan es va construir la imatge, no quan la vas descarregar. Que hello-world digui "9 months ago" és normal.
  • SIZE: mida descomprimida. Compte: aquestes mides no se sumen directament si les imatges comparteixen capes, cosa que veuràs amb detall a la lliçó 01-05.
docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:940c619fbd418f9b2b1b63e25d8861f9cc1b46e3fc8b018ccfe8b78f19b8cc4f
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a

Fixa't en la diferència entre les línies: Untagged significa que s'ha tret un nom que apuntava a la imatge; Deleted significa que les capes s'han esborrat de debò del disc. Si una altra imatge o un contenidor continuessin fent servir aquestes capes, només hi veuries Untagged.

Un error molt habitual apareix si un contenidor (encara que estigui aturat) fa servir la imatge:

Error response from daemon: conflict: unable to remove repository reference "nginx:alpine"
(must force) - container 3f2a9c1b7e4d is using its referenced image 3f8a4339aadd

La lectura és literal: hi ha un contenidor que fa servir aquesta imatge. Esborra primer el contenidor.

La gestió avançada d'imatges (etiquetatge, exportació, neteja fina) es tracta a la lliçó 02-05.

  1. Comandes essencials sobre contenidors

Comanda Què fa Exemple
docker run <imatge> Crea i arrenca un contenidor nou docker run alpine echo hola
docker ps Llista contenidors en execució docker ps
docker ps -a Llista tots, inclosos els aturats docker ps -a
docker stop <c> Atura un contenidor (senyal amable) docker stop web
docker start <c> Arrenca un contenidor aturat docker start web
docker restart <c> Atura i torna a arrencar docker restart web
docker rm <c> Elimina un contenidor aturat docker rm web
docker logs <c> Mostra la seva sortida docker logs web

El punt conceptual més important d'aquest apartat:

docker run crea un contenidor NOU cada vegada. No reutilitza l'anterior. Per tornar a arrencar-ne un d'existent es fa servir docker start.

Aquesta confusió és la causa número u que als principiants se'ls acumulin desenes de contenidors aturats.

docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS                  NAMES
3f2a9c1b7e4d   nginx:alpine   "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes               0.0.0.0:8080->80/tcp   aurora-web-demo
a71c04e9b2f8   alpine:3.20    "echo hola"              5 minutes ago   Exited (0) 5 minutes ago                          nervous_hopper

Cada columna:

  • CONTAINER ID: identificador curt. Pots fer servir un prefix únic (3f2a n'hi hauria prou).
  • IMAGE: de quina imatge va néixer.
  • COMMAND: el procés principal que executa, truncat.
  • STATUS: la dada clau. Up 2 minutes = en execució. Exited (0) = ha acabat, i aquest 0 és el codi de sortida: 0 significa que ha acabat bé; qualsevol altre número indica error (Exited (137) sol ser mort per falta de memòria o kill).
  • PORTS: mapatges de ports actius. 0.0.0.0:8080->80/tcp es llegeix "el port 8080 de qualsevol interfície de l'amfitrió va al 80 del contenidor".
  • NAMES: el nom. Si no l'hi poses tu amb --name, Docker se n'inventa un de graciós (nervous_hopper).

Sobre aturar contenidors, convé conèixer la diferència:

docker stop aurora-web-demo
docker kill aurora-web-demo
  • stop envia SIGTERM al procés principal i espera 10 segons que acabi ordenadament; si no ho fa, aleshores sí que el mata amb SIGKILL. És la manera correcta.
  • kill envia SIGKILL directament: mort immediata, sense oportunitat de tancar connexions ni de desar res.

Fes servir sempre stop llevat que el contenidor estigui penjat. El cicle de vida complet amb tots els seus estats s'estudia a la lliçó 03-02, i les opcions de docker run en profunditat a la 03-01.

  1. Comandes de sistema

Comanda Què fa
docker info Estat i configuració del daemon
docker system df Espai en disc per tipus d'objecte
docker system df -v El mateix desglossament, objecte per objecte
docker system prune Esborra contenidors aturats, xarxes sense fer servir, imatges penjades i memòria cau de build
docker system prune -a A més, esborra totes les imatges que no faci servir cap contenidor
docker system prune -a --volumes A més, esborra els volums no utilitzats

prune mereix cura, perquè és destructiu:

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] y

Deleted Containers:
a71c04e9b2f8...

Total reclaimed space: 328.4MB

Llegeix sempre la llista abans d'escriure y. Notes importants:

  • La versió sense -a és raonablement segura: esborra contenidors aturats (que potser volies conservar, però que rarament importen) i imatges dangling, és a dir, sense etiqueta, que solen ser restes de construccions anteriors.
  • La versió amb -a és agressiva: esborra totes les imatges no utilitzades. Després hauràs de tornar-ho a descarregar tot. En un portàtil és un bon recurs quan falta disc; en un servidor de producció, pensa-t'ho dues vegades.
  • --volumes és el més perillós: els volums contenen dades. Esborrar per error el volum de la base de dades d'Aurora Libros significa perdre el catàleg.

Pots evitar la pregunta amb -f, però justament en aquesta comanda la confirmació és la teva xarxa de seguretat.

  1. Una sessió completa comentada

Recorrerem una sessió de principi a fi, començant i acabant amb el sistema net. Executa-la tu també.

Pas 1. Punt de partida.

docker ps -a
docker images

Si acabes d'instal·lar Docker, hi veuràs només les capçaleres de les taules, sense files. Si vas fer el hello-world de la lliçó 01-02, tindràs aquesta imatge i un o dos contenidors aturats.

Pas 2. Un contenidor que fa una cosa i mor.

docker run hello-world

Ja coneixes la sortida. L'interessant ve ara:

docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Buit. El contenidor va imprimir el seu missatge i el seu procés va acabar, així que ja no està en execució. Però:

docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      NAMES
8b1d5e7c9a03   hello-world   "/hello"   30 seconds ago   Exited (0) 29 seconds ago   quirky_lamarr

Allà continua, aturat, ocupant espai. Aquesta és la lliçó més important de la sessió: un contenidor que acaba no desapareix.

Pas 3. Descarregar una imatge i executar una comanda concreta.

docker pull alpine:3.20
docker run alpine:3.20 echo "Hola des d'Aurora Libros"
Hola des d'Aurora Libros

Què ha passat: Docker va crear un contenidor a partir d'alpine:3.20, va substituir la comanda per defecte de la imatge per echo "Hola des d'Aurora Libros", la va executar, i en acabar el procés el contenidor va passar a Exited (0). Tot el que va després del nom de la imatge és la comanda que s'ha d'executar a dins.

Pas 4. Diversos contenidors de la mateixa imatge.

docker run alpine:3.20 uname -a
docker run alpine:3.20 cat /etc/os-release
Linux 4c9e2a71f0b3 6.8.0-52-generic #52-Ubuntu SMP x86_64 Linux
NAME="Alpine Linux"
VERSION_ID=3.20.6
PRETTY_NAME="Alpine Linux v3.20"

Dues observacions valuosíssimes:

  • uname -a mostra el nucli de l'amfitrió (6.8.0-52-generic, un nucli d'Ubuntu). Confirma amb els teus propis ulls allò de la lliçó 01-01: el contenidor comparteix el nucli de l'amfitrió.
  • cat /etc/os-release diu "Alpine Linux". És a dir: nucli d'Ubuntu, espai d'usuari d'Alpine. Això és un contenidor.

I ara:

docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
NAMES              IMAGE          STATUS
elegant_hertz      alpine:3.20    Exited (0) 10 seconds ago
zen_mendeleev      alpine:3.20    Exited (0) 25 seconds ago
kind_shirley       alpine:3.20    Exited (0) 50 seconds ago
quirky_lamarr      hello-world    Exited (0) 3 minutes ago

Quatre contenidors aturats de tres docker run amb Alpine més el hello-world. Cada run en va crear un de nou. Aquest --format que acabes de fer servir s'explica a l'apartat 8.

Pas 5. Veure els registres d'un contenidor ja acabat.

docker logs elegant_hertz
NAME="Alpine Linux"
VERSION_ID=3.20.6
...

Encara que el contenidor estigui aturat, la seva sortida es conserva. És una eina de diagnòstic fonamental: si un contenidor mor en arrencar, docker logs et diu per què.

Pas 6. Netejar.

docker rm elegant_hertz zen_mendeleev
elegant_hertz
zen_mendeleev

rm accepta diversos noms o ID i retorna els que ha esborrat. Per esborrar-los tots de cop:

docker container prune -f
Deleted Containers:
4c9e2a71f0b3...
8b1d5e7c9a03...

Total reclaimed space: 0B

container prune elimina tots els contenidors aturats; -f salta la confirmació (aquí és segur perquè ja saps el que hi ha). Comprova-ho:

docker ps -a

Taula buida. Les imatges, en canvi, hi continuen sent:

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        3.20      a8560b36e8b8   3 weeks ago    8.83MB
hello-world   latest    d2c94e258dcb   9 months ago   13.3kB

Esborrar contenidors no esborra imatges. Un cop més: imatge i contenidor són objectes diferents.

  1. Formatar la sortida amb --format

Les taules per defecte són amples i porten columnes que sovint no t'interessen. --format accepta plantilles del llenguatge Go perquè triïs tu.

Mode taula, mantenint capçaleres:

docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
NAMES              STATUS         PORTS
aurora-web-demo    Up 4 minutes   0.0.0.0:8080->80/tcp

La paraula table al principi activa el format tabular amb capçaleres; {{.Camp}} insereix un camp; \t separa columnes.

Mode línia lliure, sense capçaleres, ideal per a scripts:

docker ps --format "{{.Names}} està {{.Status}}"
aurora-web-demo està Up 4 minutes

Mode JSON, per processar amb altres eines:

docker ps --format json
docker images --format "{{json .}}"

Camps disponibles més útils:

Objecte Camps freqüents
docker ps .ID, .Names, .Image, .Command, .Status, .State, .Ports, .Size, .CreatedAt
docker images .ID, .Repository, .Tag, .Digest, .Size, .CreatedSince
docker volume ls .Name, .Driver, .Mountpoint
docker network ls .ID, .Name, .Driver, .Scope

Un exemple pràctic que faràs servir molt: obtenir només els ID per passar-los a una altra comanda.

docker ps -aq
3f2a9c1b7e4d
a71c04e9b2f8

-a (tots) combinat amb -q (quiet, només ID). I el seu ús típic:

docker rm $(docker ps -aq)

Com funciona: $(...) executa primer la comanda interior i substitueix la seva sortida com a arguments de l'exterior. El resultat és "esborra tots els contenidors aturats". Compte: si algun contenidor està en execució, rm es queixarà d'aquest en concret i esborrarà la resta. I si la llista és buida, docker rm protestarà per falta d'arguments, cosa que és inofensiva.

  1. Filtrar la sortida amb --filter

Mentre que --format decideix quines columnes veus, --filter (o -f) decideix quines files.

Filtres de contenidors més útils:

docker ps -a --filter "status=exited"
docker ps --filter "name=aurora"
docker ps -a --filter "ancestor=alpine:3.20"
docker ps -a --filter "exited=1"

Què fa cadascun:

  • status=exited: només els acabats. Altres valors: running, paused, created, restarting, dead.
  • name=aurora: els que continguin "aurora" al nom (és subcadena, no coincidència exacta). Molt útil amb la convenció de noms d'Aurora Libros.
  • ancestor=alpine:3.20: els creats a partir d'aquesta imatge.
  • exited=1: els que van acabar amb codi de sortida 1, és a dir, els que van fallar. Or pur per diagnosticar.

Filtres d'imatges:

docker images --filter "dangling=true"
docker images --filter "reference=alpine:*"
docker images --filter "before=nginx:alpine"
  • dangling=true: imatges sense etiqueta, restes de construccions. Són les que esborra docker image prune.
  • reference=alpine:*: les que casen amb aquest patró de nom.
  • before=nginx:alpine: les creades abans que aquesta imatge.

I ara la combinació de tot, que és on la CLI brilla:

docker ps -a --filter "status=exited" --filter "exited=1" \
  --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"

Traducció: "mostra'm en una taula amb nom, imatge i estat tots els contenidors que hagin acabat amb error". Dos filtres es combinen amb I lògica.

Un altre exemple orientat al nostre projecte:

docker rm $(docker ps -aq --filter "name=aurora" --filter "status=exited")

"Esborra tots els contenidors aturats el nom dels quals contingui aurora", sense tocar la resta del teu sistema. Quan als propers mòduls tinguis aurora-api, aurora-db, aurora-cache i aurora-web convivint amb altres experiments, aquest patró t'estalviarà disgustos.

Errors Habituals i Consells

  • Fer servir docker run per reprendre un contenidor. run sempre en crea un de nou. Per reprendre'l, docker start <nom>. Si et trobes amb 30 contenidors aturats idèntics, aquesta n'és la causa.
  • Confondre docker rm amb docker rmi. El primer esborra contenidors, el segon imatges. Si dubtes, fes servir les formes llargues docker container rm i docker image rm.
  • Executar docker system prune -a --volumes sense llegir l'avís. Pots esborrar les dades d'una base de dades de desenvolupament en un segon. Llegeix sempre la llista del que eliminarà.
  • Creure que els contenidors aturats no ocupen. Ocupen: la seva capa d'escriptura, els seus registres i les seves metadades. Mira-ho amb docker system df.
  • Oblidar la -a a docker ps. "No tinc contenidors" sol voler dir "no tinc contenidors en execució". Davant del dubte, docker ps -a.
  • Consell: posa sempre nom als teus contenidors amb --name. Els noms aleatoris són impossibles de recordar. Amb la convenció aurora-api, aurora-db, etc., els filtres per nom funcionen sols.
  • Consell: fes servir prefixos d'ID. No cal l'ID complet: n'hi ha prou amb els primers caràcters si són únics. docker stop 3f2a funciona.
  • Consell: --help abans que Google. L'ajuda integrada correspon exactament a la teva versió; els blogs, sovint no.

Exercicis

Exercici 1: tradueix a la forma llarga

Reescriu aquestes comandes en la forma moderna docker <objecte> <acció> i explica què fa cadascuna:

docker ps -a
docker images
docker rmi alpine:3.20
docker logs -f aurora-web-demo
docker rm -f aurora-web-demo

Després, respon: què fa exactament l'opció -f a les dues últimes comandes? Significa el mateix?

Exercici 2: inventari i neteja selectiva

Prepara l'escenari executant:

docker run --name aurora-prova-1 alpine:3.20 echo "cataleg"
docker run --name aurora-prova-2 alpine:3.20 sh -c "exit 1"
docker run --name altra-cosa alpine:3.20 echo "no tocar"

Ara, fent servir --filter i --format:

  1. Llista en una taula (nom, imatge, estat) només els contenidors el nom dels quals contingui aurora.
  2. Esbrina quin d'ells va acabar amb error, sense llegir estat per estat.
  3. Esborra en una única comanda només els contenidors aturats el nom dels quals contingui aurora, deixant altra-cosa intacte.
  4. Comprova que altra-cosa continua allà i que les imatges no s'han tocat.

Exercici 3: quant ocupa això

Respon amb comandes, no de memòria:

  1. Quant espai total ocupen les teves imatges i quant en podries recuperar?
  2. Quina imatge concreta és la més gran que tens?
  3. Si executessis docker system prune (sense -a), què s'esborraria exactament al teu sistema ara mateix? Esbrina-ho abans d'executar-lo.

Solucions

Solució a l'exercici 1

Forma curta Forma llarga Què fa
docker ps -a docker container ls -a Llista tots els contenidors, en execució i aturats
docker images docker image ls Llista les imatges locals
docker rmi alpine:3.20 docker image rm alpine:3.20 Elimina aquesta imatge del disc local
docker logs -f aurora-web-demo docker container logs -f aurora-web-demo Mostra la sortida del contenidor i la continua mostrant en directe
docker rm -f aurora-web-demo docker container rm -f aurora-web-demo Elimina el contenidor encara que estigui en execució

Sobre -f: no significa el mateix en els dos casos, i és una font clàssica de confusió.

  • A docker logs -f, -f és --follow: no tanca la sortida, es queda escoltant i mostra les línies noves a mesura que apareixen (com tail -f). Se'n surt amb Ctrl+C, cosa que no afecta el contenidor.
  • A docker rm -f, -f és --force: mata el contenidor si està en execució i després l'elimina. Sense -f, docker rm sobre un contenidor actiu retorna un error demanant-te que l'aturis primer.

Moralitat: les lletres d'opció es reutilitzen amb significats diferents segons la comanda. Davant del dubte, --help.

Solució a l'exercici 2

# 1. Taula filtrada per nom
docker ps -a --filter "name=aurora" \
  --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
NAMES              IMAGE         STATUS
aurora-prova-2     alpine:3.20   Exited (1) 5 seconds ago
aurora-prova-1     alpine:3.20   Exited (0) 10 seconds ago

(El filtre name=aurora és per subcadena, així que només hi apareixen aurora-prova-1 i aurora-prova-2.)

# 2. Només els que van fallar
docker ps -a --filter "exited=1" --format "{{.Names}}"
aurora-prova-2

El filtre exited=1 selecciona per codi de sortida. aurora-prova-2 executava sh -c "exit 1", que acaba amb codi 1, i d'aquí que sigui l'únic que hi apareix. És molt més ràpid que llegir la columna STATUS d'una llista llarga.

# 3. Esborrat selectiu
docker rm $(docker ps -aq --filter "name=aurora" --filter "status=exited")
9c1e77ab4d20
5b3f0a2e8c14

Desglossament: la comanda interior docker ps -aq --filter ... --filter ... retorna només els ID (-q) dels contenidors aturats el nom dels quals conté "aurora". La substitució $(...) els passa com a arguments a docker rm. Com que altra-cosa no casa amb el filtre de nom, no entra a la llista i sobreviu.

# 4. Comprovacions
docker ps -a --format "table {{.Names}}\t{{.Status}}"
docker images

Hi veuràs únicament altra-cosa a la llista de contenidors, i alpine:3.20 intacta a les imatges. Esborrar contenidors no esborra mai imatges.

Solució a l'exercici 3

# 1. Total i recuperable
docker system df

Llegeix la fila Images: la columna SIZE és el total ocupat i RECLAIMABLE el que alliberaries eliminant les imatges que cap contenidor no fa servir. El percentatge entre parèntesis et dona la proporció d'un cop d'ull.

# 2. La imatge més gran
docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h -r | head -5

--format produeix una línia per imatge amb mida i nom; sort -h -r ordena per mida llegible per humans (-h entén "MB", "GB") de major a menor (-r); head -5 es queda amb les cinc primeres. La primera línia és la teva imatge més gran.

# 3. Què s'esborraria amb prune (sense executar-lo)
docker ps -a --filter "status=exited" --format "table {{.Names}}\t{{.Status}}"
docker images --filter "dangling=true"
docker network ls
docker builder du

Raonament: docker system prune sense -a elimina quatre coses, així que les inspecciones per separat abans: els contenidors aturats (primera comanda), les imatges penjades sense etiqueta (segona), les xarxes no utilitzades per cap contenidor (tercera; les xarxes per defecte bridge, host i none no s'esborren mai) i la memòria cau de construcció (quarta, que mostra quant ocupa). Amb aquesta foto prèvia saps exactament què perdràs abans de confirmar amb y.

Conclusió

La CLI de Docker no es memoritza, es dedueix: docker <objecte> <acció> [opcions], on els objectes són els que gestiona el daemon (image, container, volume, network, system) i les accions es repeteixen entre ells (ls, rm, inspect, prune). Els àlies històrics —docker ps, docker images, docker rmi— continuen sent la manera habitual d'escriure-les, i ara saps a què corresponen.

T'endús les comandes essencials sobre imatges (pull, images, rmi), sobre contenidors (run, ps, ps -a, stop, start, rm, logs) i de sistema (info, system df, system prune), i dues idees que evitaran la meitat dels teus ensopecs futurs: docker run crea sempre un contenidor nou, i un contenidor que acaba no desapareix. A més, amb --format i --filter pots demanar a Docker exactament les files i columnes que necessites, cosa que resulta imprescindible quan tens més de tres o quatre objectes entre mans.

A la sessió pràctica has vist una cosa reveladora: un contenidor d'Alpine mostrant el nucli d'Ubuntu de l'amfitrió. Aquest sistema de fitxers d'Alpine, empaquetat i descarregat en segons, és una imatge, i encara no saps realment què hi ha a dins. A la lliçó següent, Entenent les Imatges de Docker, obriràs aquesta caixa: capes, copy-on-write, digests, etiquetes, imatges base, i per què latest no significa el que et penses.

Docker: De Principiant a Avançat

Mòdul 1: Introducció a Docker

Mòdul 2: Treballant amb Imatges Docker

Mòdul 3: Contenidors Docker

Mòdul 4: Docker Compose

Mòdul 5: Conceptes Avançats de Docker

Mòdul 6: Docker en Producció

Mòdul 7: Ecosistema i Eines de Docker

© Copyright 2026. Tots els drets reservats