Cicle formatiu: CFGS Administració de sistemes informàtics en xarxa (ASIX)
Mòdul: 0370 - Implantació de sistemes operatius / 0378 - Seguretat i alta disponibilitat
Docker és una plataforma de contenidors que permet empaquetar una aplicació amb totes les seves dependències (llibreries, binaris, configuració) en una unitat aïllada i portable anomenada contenidor. A diferència d’una màquina virtual, un contenidor no inclou un sistema operatiu sencer: comparteix el nucli (kernel) del sistema amfitrió i només aïlla els processos, la xarxa i el sistema de fitxers de l’aplicació.
Docker es va presentar el 2013 i està format per diversos components:
dockerd) que
crea i gestiona els contenidors.docker que fem
servir des del terminal.docker.io).| Característica | Màquina virtual | Contenidor |
|---|---|---|
| Aïllament | Total (hipervisor + kernel propi) | Procés (namespaces + cgroups del kernel host) |
| Pes | GB (SO complet) | MB (només l’aplicació i dependències) |
| Arrencada | Minuts | Mil·lisegons/segons |
| Densitat | Baixa | Alta (desenes de contenidors per host) |
| Portabilitat | Depèn de l’hipervisor | Alta (mateixa imatge a qualsevol host amb Docker) |
Ubuntu inclou un paquet docker.io als seus dipòsits,
però es recomana instal·lar Docker des del dipòsit oficial de
Docker per obtenir la versió més recent i totes les eines
(Buildx, Compose plugin, etc.).
sudo apt update
sudo apt install ca-certificates curl gnupgsudo apt remove docker docker-engine docker.io containerd runc# Crea el directori per a les claus GPG
sudo install -m 0755 -d /etc/apt/keyrings
# Descarrega i desa la clau GPG oficial
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Afegeix el dipòsit a les fonts d'APT
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt updateSi el dipòsit de Docker encara no publica paquets per al
codename de la nova versió d’Ubuntu, es pot forçar temporalment
l’última LTS suportada (per exemple noble) substituint la
variable VERSION_CODENAME en la línia anterior.
sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-pluginPaquets instal·lats:
docker-ce: el dimoni Docker Engine (Community
Edition).docker-ce-cli: la interfície de línia d’ordres.containerd.io: el runtime de contenidors.docker-buildx-plugin: construcció d’imatges
multiplataforma.docker-compose-plugin: subordre docker compose (Compose v2, integrada al CLI).sudo systemctl status docker
sudo docker run hello-worldSi tot funciona correctament, es descarregarà la imatge hello-world i es mostrarà un missatge de confirmació.
sudoPer defecte, calen privilegis d’administrador per interactuar amb el
dimoni Docker (que escolta a través d’un socket Unix propietat
de root). Per permetre que un usuari normal executi docker sense sudo:
sudo usermod -aG docker $USER
newgrp dockerAfegir un usuari al grup docker li dona, de facto,
privilegis equivalents a root sobre el sistema, ja que es
pot muntar qualsevol part del sistema de fitxers dins d’un contenidor.
Cal tenir-ho present en entorns multiusuari.
Cal tancar sessió i tornar a entrar (o executar newgrp docker) perquè el canvi de grup tingui efecte.
sudo systemctl start docker # arrencar
sudo systemctl stop docker # aturar
sudo systemctl restart docker # reiniciar
sudo systemctl enable docker # arrencada automàtica al boot
sudo systemctl disable docker # desactivar arrencada automàtica
sudo systemctl status docker # estat del serveidaemon.jsonLa configuració global del dimoni es defineix a /etc/docker/daemon.json (no existeix per defecte; cal
crear-lo).
sudo nano /etc/docker/daemon.jsonExemple de configuració habitual:
{
"data-root": "/var/lib/docker",
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-address-pools": [
{ "base": "172.30.0.0/16", "size": 24 }
],
"insecure-registries": [],
"registry-mirrors": [],
"dns": ["8.8.8.8", "1.1.1.1"],
"iptables": true,
"live-restore": true
}
Després de modificar daemon.json cal reiniciar el
dimoni:
sudo systemctl restart docker| Opció | Descripció |
|---|---|
data-root |
Directori on Docker desa imatges, contenidors i volums (per defecte /var/lib/docker). Útil per moure-ho a un disc amb més
espai. |
storage-driver |
Controlador d’emmagatzematge de capes. overlay2 és el
recomanat en kernels moderns. |
log-driver / log-opts |
Controla com es guarden els logs dels contenidors. json-file amb rotació evita que els logs omplin el
disc. |
default-address-pools |
Rangs d’IP que Docker assigna automàticament a les xarxes que es creïn. |
insecure-registries |
Llista de registres accessibles per HTTP (sense TLS) o amb certificat no vàlid, útil per a un registre intern del laboratori. |
registry-mirrors |
Mirall(s) del registre de Docker Hub, per accelerar descàrregues o evitar límits de pull rate. |
dns |
Servidors DNS que s’injecten dins dels contenidors. |
live-restore |
Permet que els contenidors segueixin en execució encara que es
reiniciï el dimoni dockerd. |
default-runtime |
Runtime per defecte (runc és l’habitual; es
pot canviar per nvidia amb el toolkit de GPU, per
exemple). |
bip |
Adreça del pont (bridge) docker0 per
defecte. |
data-root)Si el disc del sistema és petit i es vol emmagatzemar les imatges en una altra partició:
sudo systemctl stop docker
sudo rsync -aP /var/lib/docker/ /nou/disc/docker/A daemon.json:
{
"data-root": "/nou/disc/docker"
}sudo mv /var/lib/docker /var/lib/docker.old
sudo systemctl start docker
sudo docker info | grep "Docker Root Dir"Un cop comprovat que funciona correctament, es pot eliminar /var/lib/docker.old.
Docker crea per defecte tres xarxes: bridge, host i none.
docker network ls
docker network inspect bridgeCrear una xarxa pròpia (recomanat per fer comunicar contenidors entre si per nom):
docker network create --driver bridge --subnet 172.28.0.0/16 xarxa_labdocker volume create dades_web
docker volume ls
docker volume inspect dades_webÚs en executar un contenidor:
docker run -d --name web -v dades_web:/var/www/html nginxEs pot limitar el consum de recursos per contenidor en el moment d’executar-lo:
docker run -d --name app \
--memory="512m" \
--cpus="1.5" \
imatge_aplicacio# Imatges
docker pull ubuntu:26.04 # descarregar una imatge
docker images # llistar imatges locals
docker rmi <imatge> # eliminar una imatge
docker build -t app:1.0 . # construir imatge des d'un Dockerfile
# Contenidors
docker ps # contenidors en execució
docker ps -a # tots els contenidors
docker run -d --name web -p 8080:80 nginx # executar en segon pla
docker exec -it web bash # obrir un shell dins del contenidor
docker logs -f web # veure logs en temps real
docker stop web # aturar
docker start web # arrencar
docker rm web # eliminar
# Sistema
docker system df # espai utilitzat
docker system prune -a # netejar imatges/contenidors no usats
docker info # informació general del dimoniDocker Compose permet definir aplicacions multi-contenidor en un
fitxer compose.yaml:
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- dades_web:/usr/share/nginx/html
networks:
- xarxa_lab
db:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: canvia_aquesta_contrasenya
volumes:
- dades_db:/var/lib/mysql
networks:
- xarxa_lab
volumes:
dades_web:
dades_db:
networks:
xarxa_lab:Ordres bàsiques:
docker compose up -d # aixecar els serveis en segon pla
docker compose ps # estat dels serveis
docker compose logs -f # logs de tots els serveis
docker compose down # aturar i eliminar els contenidors--memory, --cpus) quan es comparteix un servidor entre diversos
alumnes o serveis.daemon.json per evitar que el disc s’ompli./var/run/docker.sock) dins de contenidors sense necessitat
real: qui té accés al socket té control total del host.bridge per defecte, per aprofitar la resolució de noms
interna entre contenidors.docker system df i fer docker system prune per alliberar espai en disc.daemon.json: https://docs.docker.com/engine/reference/commandline/dockerd/