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.
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.
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 baseFROMubuntu:20.04# Instal·la les dependènciesRUNapt-getupdate&&apt-getinstall-ypython3
# Estableix el directori de treballWORKDIR/app# Copia els fitxers locals dins de la imatgeCOPY..
# Ordre per defecteCMD["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:
dockerbuild[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.
jpuigcerver@fp:~$dockerimagels
REPOSITORY TAG IMAGE ID CREATED SIZEubuntu 24.04 1d6f3b3c8f2e 2 weeks ago 29.8MBpython 3.12 5c3c3f4e2b1a 3 weeks ago 114MB
S'observa que cada imatge s'identifica pel seu nom (REPOSITORY) i la seua etiqueta (TAG).
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.
Es crea un contenidor d' Ubuntu i s'obri una sessió interactiva:
dockerrun-it--namemy-ubuntuubuntu:24.04bash
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
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.
Es mostren els contenidors creats en els exemples anteriors:
jpuigcerver@fp:~$dockerps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1d6f3b3c8f2e ubuntu:24.04 "bash" 5 minutes ago Up 5 minutes my-ubuntu2c70eeaffd24 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:
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:~$dockerstopmy-mariadb
my-mariadbjpuigcerver@fp:~$dockerps
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES1d6f3b3c8f2e ubuntu:24.04 "bash" 10 minutes ago Up 10 minutes my-ubuntujpuigcerver@fp:~$dockerps-a
CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES1d6f3b3c8f2e ubuntu:24.04 "bash" 10 minutes ago Up 10 minutes my-ubuntu2c70eeaffd24 mariadb:latest "docker-entrypoint.s…" 5 seconds ago Exited (0) 2 seconds ago my-mariadbjpuigcerver@fp:~$dockerstartmy-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:
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).
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.
dockercomposedown[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.