En aquest article instal·larem Docker Engine a una distribució Debian o derivada (com Ubuntu o Linux Mint), i aprendrem els primers comandaments per fer feina amb imatges i contenidors.
La CLI #
La CLI de Docker proporciona una àmplia gamma de comandes per interactuar amb els serveis de Docker. Agruparem aquestes comandes en quatre categories:
- Gestió d’imatges:
docker pull,docker images,docker rmi,docker build - Gestió de contenidors:
docker run,docker ps,docker stop,docker rm - Gestió de volums:
docker volume ls,docker volume create,docker volume rm - Gestió de xarxes:
docker network ls,docker network create,docker network rm
En aquest article ens centrarem en les dues primeres categories. Els volums i les xarxes els tractarem en articles posteriors.
Instal·lació #
Per a instal·lar Docker hem de seguir les instruccions d’instal·lació per a la nostra distribució. En aquest curs farem feina principalment amb Debian o distribucions basades en Debian (Ubuntu, Linux Mint, etc.). La majoria de comandes d’aquesta secció requereixen privilegis de root, per tant fem servir sudo.
Primer de tot, ens asseguram que no hi ha paquets conflictius dels repositoris de la distribució instal·lats:
sudo apt-get purge docker.io docker-doc docker-compose \
podman-docker containerd runcNo és un error si
apt-getindica que algun d’aquests paquets no està instal·lat.
Acte seguit, instal·lam els paquets necessaris per afegir repositoris HTTPS:
sudo apt-get update
sudo apt-get install ca-certificates curlA continuació, afegeim la clau GPG oficial de Docker al keyring del sistema:
sudo install --mode=0755 --directory /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod 0644 /etc/apt/keyrings/docker.ascSi utilitzam Ubuntu, hem de substituir
debianperubuntua la URL.
Ara ja podem afegir el repositori de Docker a les fonts d’APT. El següent exemple usa el format DEB822:
ARCH=$(dpkg --print-architecture)
CODENAME=$(source /etc/os-release && echo "$VERSION_CODENAME")
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null << EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $CODENAME
Components: stable
Architectures: $ARCH
Signed-By: /etc/apt/keyrings/docker.asc
EOFNovament, si utilitzam Ubuntu, hem de substituir
debianperubuntua la líniaURIs.
Arriba ara el moment d’actualitzar l’index de paquets i instal·lar Docker Engine:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-pluginEls paquets instal·lats són:
| Paquet | Descripció |
|---|---|
docker-ce |
Docker Engine (el daemon) |
docker-ce-cli |
Interfície de línia de comandes |
containerd.io |
Runtime de contenidors |
docker-buildx-plugin |
Plugin per a construccions avançades |
docker-compose-plugin |
Plugin de Docker Compose |
El servei Docker s’inicia automàticament després de la instal·lació. Podem usar la següent comanda per verificar que està en execució:
systemctl status dockerPer defecte, les comandes de Docker requereixen privilegis de root. Per poder executar docker com a usuari normal, hem d’afegir el teu usuari al grup docker:
sudo usermod --append --groups docker $USERdocker és equivalent a tenir accés root al sistema. Hem d’assegurar-nos de que els usuaris afegits a aquest grupo són de confiança.
Haurem de tancar la sessió i tornar a iniciar-la perquè els canvis tenguin efecte. Alternativament, podem executar newgrp docker.
Per acabar, comprovam que Docker funciona correctament executant el contenidor de prova:
docker run hello-worldSi tot ha anat bé, veurem un missatge de benvinguda que confirma que Docker pot descarregar imatges i executar contenidors.
Primers passos #
Començarem comprovant la versió de Docker instal·lada:
docker --versionPer obtenir informació més detallada sobre la instal·lació podem usar docker info. Aquesta comanda mostra informació sobre el daemon, el nombre de contenidors i imatges, el controladors d’emmagatzemament, o storage drivers, i altres configuracions del sistema.
Recursos del sistema #
Abans de descarregar imatges i executar contenidors, comprovarem que tenim suficients recursos:
free -h # Memòria disponible
df -h # Espai de disc disponibleDocker emmagatzema les imatges i dades dels contenidors a /var/lib/docker per defecte. Ens convé assegurar-nos de tenir espai suficient en aquesta partició.
Ajuda integrada #
La CLI de Docker proporciona ajuda integrada per a totes les comandes:
docker --help # Llista de totes les comandes
docker pull --help # Ajuda per a una comanda específicaGestió d’imatges #
Les imatges Docker són plantilles de només lectura que contenen tot el necessari per executar una aplicació: el codi, les biblioteques, les dependències i la configuració del sistema. Les imatges són la base a partir de la qual es creen els contenidors.
Per descarregar una imatge del registre (Docker Hub per defecte), utilitzam la comanda docker pull. Prenent NGINX com a exemple:
docker pull nginxEtiquetes #
Quan no s’especifica cap etiqueta (tag), Docker descarrega la versió latest. És recomanable especificar sempre una versió concreta per garantir la reproductibilitat:
docker pull nginx:1.29Les etiquetes (tags) identifiquen versions específiques d’una imatge. Per exemple:
| Imatge | Descripció |
|---|---|
nginx:latest |
Última versió disponible (pot canviar) |
nginx:1.29 |
Versió 1.29 específica (basada en Debian) |
nginx:1.29.7 |
Versió amb patch específic |
nginx:alpine |
Variant basada en Alpine Linux |
nginx:1.29-alpine |
Versió 1.29 específica basada en Alpine Linux |
latest perquè el contingut pot canviar sense avís. Per tant, especificarem sempre una versió concreta.
Per veure les imatges disponibles al nostre sistema usarem:
docker imagesLa sortida mostra:
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
hello-world:latest e2ac70e7319a 10.1kB 0B U
nginx:1.29 0cf1d6af5ca7 161MB 0B
nginx:latest 0cf1d6af5ca7 161MB 0B La columna
EXTRAmostra flags (estats/atributs) de l’imatge. Específicament, el flagUvol dir “Unpacked”, i.e., totes les capes de la imatge estan presents localment.
Observa que nginx:1.29 i nginx:latest tenen el mateix IMAGE ID: això indica que són la mateixa imatge amb dues etiquetes diferents.
Per eliminar una imatge que ja no necessitam:
docker rmi nginx:1.29Si la imatge té múltiples etiquetes, només s’elimina l’etiqueta especificada. Per eliminar la imatge completament, hem d’eliminar totes les etiquetes o usar l’ID:
docker rmi 0cf1d6af5ca7Sistema de capes #
Quan descarregam una imatge, Docker la descarrega en capes (layers). Cada capa representa un canvi al sistema de fitxers, com ara instal·lar un paquet o copiar fitxers.
Per exemple, descarreguem la imatge alpine:3.23:
$ docker pull alpine:3.23
3.23: Pulling from library/alpine
589002ba0eae: Pull complete
...Si ara descarreguem la imatge nginx:1.29-alpine3.23:
$ docker pull nginx:1.29-alpine3.23
1.29-alpine3.23: Pulling from library/nginx
589002ba0eae: Already exists
8892f80f46a0: Pull complete
91d1c9c22f2c: Pull complete
...Podem veure com Docker ha reutilitzat la capa amb identificador 589002ba0eae de la imatge alpine:3.23 per la imatge nginx:1.29-alpine3.23.
Si ara descarregam la imatge postgres:18-alpine3.23:
$ docker pull postgres:18-alpine3.23
18-alpine3.23: Pulling from library/postgres
589002ba0eae: Already exists
a92c4c6bf7bf: Pull complete
36af16c7d2ce: Pull complete
...Podem veure com Docker ha reutilitzat la capa amb identificador 589002ba0eae de la imatge alpine:3.23 per la imatge postgres:18-alpine3.23.
Aquest sistema de capes permet:
- Eficiència d’emmagatzematge, car les capes comunes entre imatges només s’emmagatzemen una vegada.
- Descàrregues ràpides, car només es descarreguen les capes que no tens localment.
- Construccions incrementals, car Docker reutilitza les capes que no han canviat quan construeixes imatges.
Execució de contenidors #
Amb les imatges descarregades, ja podem crear i executar contenidors. Un contenidor és una instància executable d’una imatge.
La comanda docker run crea i executa un contenidor a partir d’una imatge:
docker run nginxAquesta comanda:
- Cerca la imatge
nginx:latestlocalment. - Si no la troba, la descarrega de Docker Hub.
- Crea un nou contenidor a partir de la imatge.
- Executa el contenidor en primer pla (foreground).
Per aturar el contenidor, prem Ctrl+C.
Per executar un contenidor en segon pla (background), utilitzam l’opció --detach o -d:
docker run --detach nginxLa comanda retorna l’ID del contenidor i allibera el terminal.
Per defecte, Docker assigna noms aleatoris als contenidors (com quirky_nobel o angry_darwin). Pots assignar un nom descriptiu amb --name:
docker run --detach --name web nginxPublicar ports #
Els contenidors, per defecte, estan aïllats de la xarxa de l’amfitrió. Per accedir a un servei dins del contenidor, hem de publicar el port amb l’opció --publish o -p:
docker run --detach --name web --publish 8080:80 nginxAquesta comanda mapeja el port 8080 de l’amfitrió al port 80 del contenidor. Ara podem accedir a NGINX des del navegador a http://localhost:8080/.
La sintaxi és --publish PORT_AMFITRIÓ:PORT_CONTENIDOR.
Estat dels contenidors #
Per llistar els contenidors en execució:
docker psPer veure tots els contenidors, incloent els aturats:
docker ps --allAturar i eliminar #
Per aturar un contenidor en execució:
docker stop webPer eliminar un contenidor aturat:
docker rm webPots combinar ambdues accions amb l’opció --force:
docker rm --force webExercicis pràctics #
Es proposen tres exercicis pràctics per facilitar l’aprenentatge progressiu.
Exercici 1 #
Explorar Docker Hub.
- Accedeix a Docker Hub i cerca la imatge oficial de Caddy (un servidor web modern amb HTTPS automàtic).
- Identifica quines etiquetes (tags) estan disponibles i quina és la mida de la imatge
caddy:alpine. - Descarrega la imatge
caddy:2.11-alpineal teu sistema. - Compara la mida de
caddy:2.11-alpineamb la denginx:1.29-alpineque hem usat durant la lliçó. Quina és més lleugera? - Elimina ambdues imatges del sistema.
Exercici 2 #
Servidor web Caddy
- Descarrega la imatge
caddy:2.11-alpine. - Executa un contenidor anomenat
caddy-weben segon pla, publicant el port 9000 de l’amfitrió al port 80 del contenidor. - Accedeix a
http://localhost:9000des del navegador. Quina pàgina es mostra? - Sense aturar el contenidor anterior, executa un segon contenidor anomenat
caddy-web2publicant el port 9001. - Verifica amb
docker psque ambdós contenidors estan en execució. - Atura i elimina ambdós contenidors amb una sola comanda
docker rm.
Pista: Usa
docker rm --helpper a averiguar com esborrar múltiples contenidors amb una sola comanda.
Exercici 3 #
Base de dades MariaDB
- Cerca a Docker Hub la imatge oficial de MariaDB i identifica l’etiqueta de la versió LTS més recent.
- Descarrega aquesta imatge.
- Consulta la documentació de la imatge a Docker Hub i identifica quines variables d’entorn són obligatòries per executar el contenidor.
- Executa un contenidor anomenat
mariadb-testen segon pla, publicant el port 3306 i configurant les variables d’entorn necessàries. - Verifica que el contenidor està en execució amb docker ps.
- Atura i elimina el contenidor.
Pista: Usa
docker run --helpper a averiguar com executar un contenidor amb variables d’entorn.