Salta el contingut

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

docker run hello-world

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:

docker run hello-world

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:

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    74cc54e27dc4   8 months ago   10.1kB

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:

docker pull hello-world

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

docker pull ubuntu:24.04

1.3 On és el contenidor?

Si la imatge és el "motlle", on és el contenidor que hem creat? Proveu:

docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

La llista és buida! docker ps només mostra els contenidors en execució. Per veure'ls tots, també els aturats:

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

  1. Cada docker run crea un contenidor nou. Hem executat la comanda dues vegades i tenim dos contenidors, tots dos creats a partir de la mateixa imatge.
  2. El contenidor s'ha aturat sol (Exited (0)). El programa /hello escriu el missatge i acaba. Un contenidor viu exactament el que viu el seu procés principal: quan aquest acaba, el contenidor s'atura.
  3. 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:

docker run ubuntu:24.04 cat /etc/os-release

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:

uname -r                          # a l'amfitrió
docker run ubuntu:24.04 uname -r  # dins del contenidor

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:

docker run -it ubuntu:24.04 bash
  • -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

  1. Executeu docker run --rm alpine:3.20 echo hola i copieu les línies de Pulling.
  2. Torneu-la a executar. Quines línies han desaparegut? Per què?
  3. Executeu docker run --rm alpine:3.19 echo hola. Es torna a descarregar? Per què, si ja teníeu "alpine"?
  4. Mireu docker images. Quantes imatges d'alpine teniu i quant ocupen?
  5. Executeu tres vegades docker run hello-world sense --rm i comproveu amb docker ps -a quants 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.