Pas 1 - El primer contenidor
En aquest primer pas no volem entendre-ho tot: volem executar un contenidor i observar amb atenció què fa Docker. Tot el que veurem aquí (d'on surt la imatge, on es guarda, per què el contenidor s'atura) és la base de la resta del bloc.
Objectius del pas
- Executar un contenidor amb
docker run. - Veure que la imatge es descarrega de Docker Hub la primera vegada i que després es fa servir la còpia local.
- Distingir entre imatge i contenidor amb
docker imagesidocker ps -a. - Entendre que un contenidor viu mentre viu el seu procés principal.
1.1 Hello World: la primera execució
Obriu un terminal i executeu:
La sortida serà semblant a aquesta:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:d715f14f9eca81473d9112df50457893aa4d099adeb4729f679006bf5ea12407
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Llegiu-la línia per línia, perquè explica exactament el que ha passat:
| Línia | Què significa |
|---|---|
Unable to find image 'hello-world:latest' locally |
Docker ha buscat la imatge al vostre ordinador i no l'ha trobada. |
latest: Pulling from library/hello-world |
L'ha anat a buscar al registre per defecte, Docker Hub, dins de library (les imatges oficials). |
e6590344b1a5: Pull complete |
Ha descarregat una capa de la imatge. Les imatges grans en tenen moltes (ho veurem al pas 2). |
Digest: sha256:... |
L'identificador únic i immutable del contingut descarregat. |
Status: Downloaded newer image... |
La imatge ja és al vostre disc. |
Hello from Docker! |
Això ja no és Docker: és la sortida del programa que hi ha dins del contenidor. |
El recorregut complet és aquest:
sequenceDiagram
participant U as Usuari (CLI docker)
participant D as Dimoni dockerd
participant L as Emmagatzematge local
participant H as Docker Hub
U->>D: docker run hello-world
D->>L: Tinc hello-world latest?
L-->>D: No
D->>H: pull library/hello-world latest
H-->>D: capes i manifest
D->>L: Desa la imatge
D->>D: Crea el contenidor i l'arrenca
D-->>U: Sortida del programa
Note over D: El programa acaba i el contenidor s atura
Fixeu-vos que la comanda docker que escriviu és només un client. Qui fa la feina és el dimoni dockerd, que s'executa en segon pla al sistema. El client li envia l'ordre i el dimoni descarrega, crea i arrenca.
1.2 La segona vegada ja no la descarrega
Torneu a executar exactament la mateixa comanda:
Ara la sortida comença directament amb Hello from Docker!. No hi ha cap línia de Pulling: Docker ha trobat la imatge al disc local i no ha anat a Internet. Per això és molt més ràpid.
Podeu veure les imatges que teniu descarregades amb:
On es guarden les imatges?
A Linux, Docker desa imatges, contenidors i volums a /var/lib/docker/. Amb Docker Desktop (Windows i Mac) aquest directori és dins de la màquina virtual que Docker gestiona per vosaltres. No l'heu de tocar mai a mà: sempre es gestiona amb comandes docker.
La imatge local no s'actualitza sola
Si a Docker Hub publiquen una versió nova de hello-world:latest, Docker continuarà fent servir la còpia local que ja teniu. Per actualitzar-la cal demanar-ho explícitament:
o bé, en executar, forçar la comprovació amb docker run --pull always hello-world.
També podeu descarregar sense executar, cosa útil per preparar una màquina abans de fer classe o abans de treballar sense connexió:
1.3 On és el contenidor?
Si la imatge és el "motlle", on és el contenidor que hem creat? Proveu:
La llista és buida! docker ps només mostra els contenidors en execució. Per veure'ls tots, també els aturats:
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
3f1b2c9e8a71 hello-world "/hello" 30 seconds ago Exited (0) 29 seconds ago quirky_turing
9ad04e7c55b2 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago brave_hopper
D'aquí traiem tres idees clau:
- Cada
docker runcrea un contenidor nou. Hem executat la comanda dues vegades i tenim dos contenidors, tots dos creats a partir de la mateixa imatge. - El contenidor s'ha aturat sol (
Exited (0)). El programa/helloescriu el missatge i acaba. Un contenidor viu exactament el que viu el seu procés principal: quan aquest acaba, el contenidor s'atura. - El contenidor aturat continua existint. Ocupa espai i es pot tornar a arrencar o eliminar. Si no li doneu nom, Docker n'inventa un (
quirky_turing,brave_hopper...).
flowchart LR
I[(Imatge<br/>hello-world)] -->|docker run| C1[Contenidor 1<br/>Exited]
I -->|docker run| C2[Contenidor 2<br/>Exited]
classDef img fill:#2563EB,stroke:#1E40AF,color:#FFFFFF
classDef cont fill:#16A34A,stroke:#166534,color:#FFFFFF
class I img
class C1,C2 cont
1.4 Executar una ordre dins d'una altra distribució
hello-world és molt limitada. Provem amb una imatge d'Ubuntu i demanem-li que executi una ordre concreta:
Si no teníeu la imatge, veureu com es descarrega. Després, la sortida mostrarà que el sistema de fitxers del contenidor és un Ubuntu 24.04, encara que el vostre sistema sigui un altre (Debian, Fedora, Windows amb WSL...).
Ara compareu el kernel de dins i de fora:
Els dos números coincideixen. És la demostració pràctica del que vam veure a Fonaments de Docker: el contenidor té el seu propi sistema de fitxers, però comparteix el kernel de l'amfitrió. No és una màquina virtual.
1.5 Mode interactiu
Si volem "entrar" en un contenidor i treballar-hi, cal demanar un terminal interactiu:
-i(interactive) manté oberta l'entrada estàndard.-t(tty) assigna un terminal.
Ara el prompt canvia (root@a1b2c3d4e5f6:/#). Proveu ls /, ps aux, hostname. Fixeu-vos que ps aux mostra molt pocs processos: només bash (amb PID 1) i el mateix ps. El contenidor només veu els seus processos.
Escriviu exit. En sortir del bash, el procés principal acaba i, per tant, el contenidor s'atura: la mateixa regla que amb hello-world.
1.6 Contenidors d'un sol ús: --rm
Com que cada docker run deixa un contenidor aturat, és fàcil acumular-ne desenes. Per a proves ràpides feu servir --rm, que elimina el contenidor automàticament quan s'atura:
docker run --rm ubuntu:24.04 echo "Hola des d'un contenidor"
docker ps -a # aquest contenidor ja no hi és
Miniactivitat - Observar la descàrrega i la memòria cau local
- Executeu
docker run --rm alpine:3.20 echo holai copieu les línies dePulling. - Torneu-la a executar. Quines línies han desaparegut? Per què?
- Executeu
docker run --rm alpine:3.19 echo hola. Es torna a descarregar? Per què, si ja teníeu "alpine"? - Mireu
docker images. Quantes imatges d'alpine teniu i quant ocupen? - Executeu tres vegades
docker run hello-worldsense--rmi comproveu ambdocker ps -aquants contenidors s'han creat.
1.7 Neteja
docker container prune # elimina TOTS els contenidors aturats (demana confirmació)
docker rm quirky_turing # o un de concret, pel nom o per l'ID
Eliminar el contenidor no elimina la imatge: la propera vegada que feu docker run hello-world no la tornarà a descarregar.
Resum del pas
| Comanda | Què fa |
|---|---|
docker run IMATGE |
Crea un contenidor nou i l'arrenca (descarrega la imatge si no és local) |
docker run IMATGE ordre |
Igual, però executa ordre en lloc de l'ordre per defecte |
docker run -it IMATGE bash |
Contenidor interactiu amb terminal |
docker run --rm ... |
Elimina el contenidor quan s'atura |
docker pull IMATGE |
Només descarrega (o actualitza) la imatge |
docker images |
Llista les imatges locals |
docker ps / docker ps -a |
Contenidors en execució / tots |
docker container prune |
Elimina els contenidors aturats |
Següent pas: hem vist noms com hello-world, ubuntu:24.04 o library/hello-world. Al Pas 2 estudiarem com es nomenen les imatges, què són les capes i quin format tenen per dins.