Salta el contingut
 

Docker

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Docker

Docker és una plataforma oberta que permet crear, distribuir i executar aplicacions dins de contenidors lleugers i portables. Un contenidor és un entorn aïllat que inclou tot el necessari per executar una aplicació: codi, llibreries, ferramentes i configuracions.

Com que el contenidor porta tot el que necessita, l'aplicació s'executa de manera consistent, independentment del sistema operatiu o de la configuració de la màquina. És a dir, una aplicació que funciona dins d'un contenidor en un ordinador funcionarà exactament igual en un servidor, en un altre ordinador o en el núvol, sempre que aquest sistema tinga instal·lat Docker.

Els contenidors es creen a partir d'imatges, que actuen com a plantilles d'un entorn preconfigurat. Una imatge conté tot allò necessari perquè una aplicació puga funcionar: el sistema operatiu mínim, les biblioteques, les dependències i el codi mateix. Quan s'executa una imatge, Docker crea un contenidor, que és una instància en funcionament d'aquesta imatge.

Les característiques principals de Docker són:

  • Contenidors lleugers: són entorns aïllats i lleugers, més eficients que les màquines virtuals.
  • Portabilitat i consistència: els contenidors s'executen de la mateixa manera en qualsevol sistema on Docker estiga instal·lat.
  • Aïllament: cada contenidor s'executa de forma independent i aïllada, amb el seu propi sistema de fitxers, processos, xarxa i espai d'usuari.
  • Imatges versionades i reutilitzables: les imatges es creen en capes, i cada canvi afig una nova capa. Així, les imatges es poden reutilitzar i, en actualitzar-les, només cal descarregar les capes modificades.
  • Automatització: tot l'entorn i el procés de creació d'una imatge es defineixen en un fitxer anomenat Dockerfile.
  • Gestió de xarxes i volums: Docker permet crear xarxes virtuals perquè els contenidors es comuniquen de manera segura, i volums per conservar les dades de manera persistent fora del contenidor.

Arquitectura i funcionament

Docker segueix una arquitectura client/servidor formada per dos components:

  • Docker Daemon: és el servei que s'executa en segon pla i s'encarrega de gestionar els contenidors i les imatges.
  • Docker Client: és el programa que envia les ordres al Docker Daemon. Pot ser una línia d'ordres (docker) o una interfície gràfica, com Docker Desktop.

Imatges

Una imatge és el punt de partida de qualsevol contenidor. Es pot descarregar una imatge ja feta d'un registre o bé crear-ne una de pròpia.

Creació d'imatges

Per crear una imatge pròpia, s'utilitza un fitxer anomenat Dockerfile, on es defineix pas a pas com ha de ser la imatge. Cada línia del Dockerfile representa una instrucció i genera una nova capa dins de la imatge.

Les instruccions més habituals són:

  • FROM: defineix la imatge base des de la qual es crearà la nova imatge.
  • WORKDIR: estableix el directori de treball dins del contenidor.
  • RUN: executa una ordre dins de la imatge durant el procés de construcció.
  • COPY: copia fitxers o directoris des del sistema amfitrió a la imatge.
  • CMD: defineix l'ordre per defecte que s'executarà quan es cree un contenidor a partir de la imatge.

Documentació oficial de Docker

Exemple: Dockerfile bàsic amb Python a partir de la imatge d' Ubuntu

El Dockerfile següent crea una imatge que executa un programa en Python:

# Imatge base
FROM ubuntu:20.04

# Instal·la les dependències
RUN apt-get update && apt-get install -y python3

# Estableix el directori de treball
WORKDIR /app

# Copia els fitxers locals dins de la imatge
COPY . .

# Ordre per defecte
CMD ["python3", "main.py"]

S'observa que cada instrucció correspon a un pas: es parteix d' Ubuntu, s'instal·la Python, es copia el codi i s'indica quin programa s'executa.

Una vegada definit el Dockerfile, la imatge es construeix amb l'ordre docker build:

docker build [opcions] <directori>
  • <directori>: directori on es troba el fitxer Dockerfile.

Algunes de les opcions més habituals són:

  • -t <nom-imatge>: assigna un nom i una etiqueta (tag) a la imatge.
  • -f <nom-fitxer>: especifica un fitxer Dockerfile amb un nom diferent del nom per defecte.
  • --no-cache: no utilitza la memòria cau durant la construcció i força la reconstrucció de totes les capes.
  • --build-arg <NOM_VARIABLE=valor>: defineix variables d'argument que es poden utilitzar dins del Dockerfile.
  • --rm: elimina les capes intermèdies després de construir la imatge (activat per defecte).
  • --pull: força la descàrrega de la imatge base més recent abans de construir la nova imatge.

Documentació oficial: docker build – Docker

Obtenció d'imatges (docker pull)

Docker Hub és el registre oficial de Docker, que permet emmagatzemar, compartir i gestionar imatges.

Per descarregar una imatge d'aquest registre al sistema local, s'utilitza l'ordre docker image pull o la seua forma abreujada docker pull:

docker image pull <nom-imatge>
docker pull <nom-imatge>
  • <nom-imatge>: nom de la imatge i, opcionalment, la seua etiqueta (nom:etiqueta).

Documentació oficial: docker image pull – Docker

Exemple: Obtindre la imatge oficial d' Ubuntu

Es descarrega la versió 24.04 de la imatge oficial d' Ubuntu:

docker pull ubuntu:24.04

Llistat d'imatges (docker image ls)

Per consultar les imatges descarregades en el sistema, s'utilitza l'ordre docker image ls:

docker image ls [opcions]
docker images [opcions]

Documentació oficial: docker image ls – Docker

Exemple: Llistar les imatges descarregades

Es mostren les imatges disponibles en el sistema:

jpuigcerver@fp:~ $ docker image ls
REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
ubuntu             24.04     1d6f3b3c8f2e   2 weeks ago    29.8MB
python             3.12      5c3c3f4e2b1a   3 weeks ago    114MB

S'observa que cada imatge s'identifica pel seu nom (REPOSITORY) i la seua etiqueta (TAG).

Eliminació d'imatges (docker image rm)

Les imatges ocupen espai en el disc. Per eliminar les que ja no es necessiten, s'utilitza l'ordre docker image rm:

docker image rm <nom-imatge> [<nom-imatge> ...]
docker rmi <nom-imatge> [<nom-imatge> ...]
  • <nom-imatge>: nom o ID de la imatge. Se'n poden indicar diverses alhora.

Documentació oficial: docker image rm – Docker

Exemple: Eliminar la imatge hello-world
docker image rm hello-world

Contenidors

Els contenidors són instàncies en execució d'una imatge, amb el seu propi entorn aïllat i recursos. A partir d'una mateixa imatge, es poden crear tants contenidors com calga.

Creació i execució de contenidors (docker run)

Per crear i executar un contenidor a partir d'una imatge, s'utilitza l'ordre docker container run o la seua forma abreujada docker run:

docker container run [opcions] <nom-imatge> [ordre] [arguments]
docker run [opcions] <nom-imatge> [ordre] [arguments]
  • <nom-imatge>: nom de la imatge a partir de la qual es crearà el contenidor.
  • [ordre]: (opcional) ordre que s'executarà dins del contenidor.
  • [arguments]: (opcional) arguments per a l'ordre.

Algunes de les opcions més habituals són:

  • -d o --detach: executa el contenidor en segon pla (detached mode).
  • --name <nom-contenidor>: assigna un nom personalitzat al contenidor.
  • -p <port-amfitrió>:<port-contenidor>: publica un port del contenidor en un port del sistema amfitrió.
  • -v <directori-amfitrió>:<directori-contenidor>: crea un volum per compartir dades entre el sistema amfitrió i el contenidor.
  • -e <NOM_VARIABLE=valor>: defineix variables d'entorn dins del contenidor.
  • -i: manté l'entrada estàndard oberta, de manera que es pot interactuar amb el contenidor.
  • -t: assigna un terminal TTY al contenidor, útil per a sessions interactives.

Documentació oficial: docker run – Docker

Exemple: Crear i executar un contenidor d' Ubuntu

Es crea un contenidor d' Ubuntu i s'obri una sessió interactiva:

docker run -it --name my-ubuntu ubuntu:24.04 bash

Aquesta ordre crea un contenidor anomenat my-ubuntu a partir de la imatge oficial d' Ubuntu 24.04 i executa bash dins del contenidor en un terminal interactiu.

Exemple: Crear i executar una instància de MariaDB

Es crea un contenidor amb un servidor MariaDB:

docker run -d --name my-mariadb -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 \
    -v ./mariadb-data:/var/lib/mysql mariadb:latest

Aquesta ordre:

  • Crea i executa un contenidor anomenat my-mariadb a partir de la imatge oficial de MariaDB.
  • Defineix la variable d'entorn MYSQL_ROOT_PASSWORD, que estableix la contrasenya de l'usuari root.
  • Publica el port 3306 del contenidor en el port 3306 del sistema amfitrió.
  • Crea un volum que guarda el directori /var/lib/mysql del contenidor en el directori ./mariadb-data de l'amfitrió, de manera que les dades es conserven.
  • Executa el contenidor en segon pla.

Llistat de contenidors (docker ps)

Per consultar els contenidors del sistema, s'utilitza l'ordre docker ps, que té diverses formes equivalents:

docker container ls [opcions]
docker container list [opcions]
docker container ps [opcions]
docker ps [opcions]

Algunes de les opcions més habituals són:

  • -a o --all: mostra tots els contenidors, incloent-hi els aturats.
  • -q o --quiet: mostra només els ID dels contenidors.

Documentació oficial: docker container ls – Docker

Exemple: Llistar els contenidors en execució

Es mostren els contenidors creats en els exemples anteriors:

jpuigcerver@fp:~ $ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                                         NAMES
1d6f3b3c8f2e   ubuntu:24.04     "bash"                   5 minutes ago   Up 5 minutes                                                 my-ubuntu
2c70eeaffd24   mariadb:latest   "docker-entrypoint.s…"   5 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp   my-mariadb

S'observa que la columna PORTS mostra els ports publicats de cada contenidor.

Aturar i reiniciar contenidors (docker stop i docker start)

Un contenidor aturat no consumeix recursos, però conserva el seu estat. Per aturar un contenidor en execució, s'utilitza l'ordre docker container stop:

docker container stop <nom-contenidor> [<nom-contenidor> ...]
docker stop <nom-contenidor> [<nom-contenidor> ...]
  • <nom-contenidor>: nom o ID del contenidor que es vol aturar.

Per tornar a arrancar un contenidor aturat, s'utilitza l'ordre docker container start:

docker container start <nom-contenidor> [<nom-contenidor> ...]
docker start <nom-contenidor> [<nom-contenidor> ...]
  • <nom-contenidor>: nom o ID del contenidor que es vol arrancar.

Documentació oficial de Docker

Exemple: Aturar i reiniciar el contenidor my-mariadb

S'atura el contenidor my-mariadb, es comprova el seu estat i es torna a arrancar:

jpuigcerver@fp:~ $ docker stop my-mariadb
my-mariadb
jpuigcerver@fp:~ $ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         NAMES
1d6f3b3c8f2e   ubuntu:24.04     "bash"                   10 minutes ago  Up 10 minutes  my-ubuntu
jpuigcerver@fp:~ $ docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                     NAMES
1d6f3b3c8f2e   ubuntu:24.04     "bash"                   10 minutes ago  Up 10 minutes              my-ubuntu
2c70eeaffd24   mariadb:latest   "docker-entrypoint.s…"   5 seconds ago   Exited (0) 2 seconds ago   my-mariadb
jpuigcerver@fp:~ $ docker start my-mariadb
my-mariadb

S'observa que, una vegada aturat, my-mariadb només apareix amb l'opció -a.

Executar ordres dins d'un contenidor (docker exec)

Sovint cal executar una ordre dins d'un contenidor que ja està en marxa, per exemple, per obrir un terminal o un client de base de dades. Per fer-ho, s'utilitza l'ordre docker container exec:

docker container exec [opcions] <nom-contenidor> <ordre> [arguments]
docker exec [opcions] <nom-contenidor> <ordre> [arguments]
  • <nom-contenidor>: nom o ID del contenidor on s'executarà l'ordre.
  • <ordre>: ordre que s'executarà dins del contenidor.
  • [arguments]: (opcional) arguments per a l'ordre.

Algunes de les opcions més habituals són:

  • -i: manté l'entrada estàndard oberta, de manera que es pot interactuar amb el contenidor.
  • -t: assigna un terminal TTY al contenidor, útil per a sessions interactives.
  • -u <usuari>: executa l'ordre amb un usuari concret del contenidor.
  • -w <directori>: estableix el directori de treball abans d'executar l'ordre.
  • -e <NOM_VARIABLE=valor>: defineix variables d'entorn per a l'ordre.

Documentació oficial: docker exec – Docker

Exemple: Executar una sessió interactiva de bash dins del contenidor my-ubuntu
docker exec -it my-ubuntu bash
Exemple: Executar el client mariadb dins del contenidor my-mariadb
docker exec -it my-mariadb mariadb -u root -p

Eliminació de contenidors (docker rm)

L'ordre docker rm elimina un o més contenidors aturats del sistema:

docker container rm [opcions] <nom-contenidor> [<nom-contenidor> ...]
docker rm [opcions] <nom-contenidor> [<nom-contenidor> ...]
  • <nom-contenidor>: nom o ID del contenidor que es vol eliminar. Se'n poden indicar diversos alhora.

Algunes de les opcions més habituals són:

  • -f o --force: força l'eliminació d'un contenidor en execució, aturant-lo primer.
  • -v o --volumes: elimina també els volums associats al contenidor.

Documentació oficial: docker container rm – Docker

Exemple: Eliminar el contenidor my-ubuntu
docker rm my-ubuntu

Docker Compose

Quan un contenidor necessita moltes opcions, l'ordre docker run es fa llarga i difícil de recordar. Docker Compose és una ferramenta que permet definir la configuració i l'execució d'un o més contenidors en un fitxer docker-compose.yml, on s'especifiquen les imatges, les xarxes, els volums i la resta de paràmetres necessaris.

L'ordre docker compose ve integrada amb la instal·lació de Docker, de manera que ja no cal instal·lar-la per separat (abans era docker-compose).

Documentació oficial: Docker Compose – Docker

Exemple: Fitxer docker-compose.yml amb una instància de MariaDB

El fitxer següent defineix un servidor MariaDB:

services:
  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
    ports:
      - "3306:3306"
    volumes:
      - ./mariadb-data:/var/lib/mysql

Aquest fitxer defineix un servei anomenat db que utilitza la imatge oficial de MariaDB i estableix:

  • La variable d'entorn MYSQL_ROOT_PASSWORD, que estableix la contrasenya de l'usuari root.
  • La publicació del port 3306 del contenidor en el port 3306 del sistema amfitrió.
  • Un volum que guarda el directori /var/lib/mysql del contenidor en el directori ./mariadb-data de l'amfitrió, de manera que les dades es conserven.

Iniciar els serveis (docker compose up)

Per iniciar els serveis definits en el fitxer docker-compose.yml, s'utilitza l'ordre docker compose up:

docker compose up [opcions] [serveis...]
  • [serveis...]: (opcional) noms dels serveis que es volen iniciar. Si no se n'indica cap, s'inicien tots els serveis definits en el fitxer.

Algunes de les opcions més habituals són:

  • -d o --detach: inicia els serveis en segon pla.
  • --build: força la reconstrucció de les imatges abans d'iniciar els serveis.
  • --force-recreate: força la recreació dels contenidors, encara que la configuració no haja canviat.

Documentació oficial: docker compose up – Docker

Exemple: Iniciar els serveis en segon pla
docker compose up -d

Aturar els serveis (docker compose down)

Per aturar els serveis en execució, s'utilitza l'ordre docker compose down. A diferència de docker stop, aquesta ordre també elimina els contenidors definits en el fitxer i les xarxes creades per Docker Compose, incloent-hi la xarxa per defecte si no se n'ha especificat cap altra.

docker compose down [opcions] [serveis...]
  • [serveis...]: (opcional) noms dels serveis que es volen aturar. Si no se n'indica cap, s'aturen tots els serveis definits en el fitxer.

Algunes de les opcions més habituals són:

  • --volumes: elimina també els volums associats als serveis.
  • --rmi <tipus>: elimina les imatges associades als serveis.

    Valors de --rmi
    Valor Significat
    all Elimina totes les imatges dels serveis
    local Elimina només les imatges construïdes localment

Documentació oficial: docker compose down – Docker

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.