Salta el contingut

Fonaments de Docker

Què és Docker i per què ha revolucionat el desenvolupament de programari

Docker Cheat Sheet

Pots consultar una guia ràpida en aquest link

Quan comenceu a treballar amb aplicacions web modernes, us trobareu amb un problema clàssic que ha existit des dels inicis de la informàtica: "al meu ordinador funciona, però al servidor no". Aquest problema apareix constantment i és frustrant: desenvolupeu una aplicació al vostre portàtil, tot funciona perfectament, però quan l'intenteu desplegar al servidor de producció, alguna cosa falla. Potser és perquè al servidor hi ha una versió diferent de Python, o falta una llibreria, o la configuració del sistema operatiu és diferent.

Docker resol aquest problema d'una manera elegant: permet empaquetar l'aplicació juntament amb totes les seves dependències i configuració dins d'un "contenidor". Aquest contenidor és com una capsa autònoma que conté tot el que l'aplicació necessita per funcionar. El mateix contenidor que executeu al vostre ordinador es pot executar idènticament al servidor, al núvol, o a l'ordinador d'un company. Això garanteix que l'aplicació es comportarà exactament igual a tot arreu.

Però Docker és molt més que això. Ha canviat completament la manera com desenvolupem, desplegem i gestionem aplicacions. Abans de Docker, si volíeu provar una aplicació nova, havíeu d'instal·lar un munt de programari, configurar coses, i possiblement trencar alguna part del vostre sistema. Amb Docker, podeu executar pràcticament qualsevol aplicació amb una sola comanda, sense tocar la configuració del vostre sistema. Quan acabeu, l'elimineu i el vostre sistema queda exactament com estava.

Docker és una plataforma de codi obert creada el 2013 per l'empresa dotCloud (ara Docker, Inc.). Des de llavors s'ha convertit en un estàndard de la indústria, utilitzat per empreses de tots els tamanys, des de startups fins a corporacions multinacionals. Segons les estadístiques, milions de desenvolupadors utilitzen Docker diàriament, i hi ha milers de milions de contenidors executant-se arreu del món.

Versions actuals d'octubre 2025

És important que sapigueu amb quines versions estareu treballant. Al moment d'escriure aquest document, a finals d'octubre de 2025, la versió més recent de Docker Engine és la v28. Docker Engine és el motor principal que executa els contenidors. Aquesta versió va introduir millores significatives en la gestió de xarxes, seguretat reforçada, i noves funcionalitats com muntar imatges directament dins de contenidors.

Docker Desktop, que és l'aplicació gràfica que inclou Docker Engine i altres eines útils, està a la versió 4.45 o superior. Des d'agost de 2025, Docker ha canviat la seva estratègia de llançaments i ara publiquen versions noves cada dues setmanes, amb l'objectiu d'arribar a llançaments setmanals abans de finals del 2025. Això vol dir que tindreu accés a noves funcionalitats i correccions de seguretat molt més ràpidament que abans.

Docker Compose, que és l'eina per gestionar aplicacions multi-contenidor, va per la versió 2.39 o superior. I Dockerfile, el format per definir com construir imatges, està a la versió 1.14 de sintaxi.

Podeu trobar tota la informació oficial sobre versions a https://docs.docker.com/engine/release-notes/28/ per Docker Engine, i a https://docs.docker.com/desktop/release-notes/ per Docker Desktop. La pàgina https://endoflife.date/docker-engine també documenta el suport de les diferents versions.


Entenent els conceptes bàsics: contenidors, imatges i el que els diferencia

Abans d'entrar en detalls tècnics, és fonamental que entengueu tres conceptes que són el cor de Docker: contenidors, imatges, i la diferència entre ells. És un dels punts que més confusió genera quan comenceu, però un cop ho tingueu clar, tot el resta té molt més sentit.

Arquitectura Docker

Què és exactament un contenidor?

Un contenidor és com una petita màquina virtual lleugera que executa la vostra aplicació. Però atenció, no és realment una màquina virtual, tot i que s'assembla. La diferència és important: una màquina virtual emula tot un ordinador complet amb el seu propi sistema operatiu, kernel, etc. Un contenidor, en canvi, comparteix el kernel del sistema operatiu amfitrió però està aïllat de la resta del sistema.

Penseu en un contenidor com un apartament d'un edifici. Tots els apartaments comparteixen l'estructura bàsica de l'edifici (l'equivalent al kernel del sistema operatiu), però cada apartament té les seves pròpies habitacions, mobles, i inquilins que no interfereixen amb els altres apartaments. Els contenidors funcionen així: comparteixen el sistema operatiu base per eficiència, però cada contenidor té el seu propi sistema de fitxers, processos, i xarxa.

Aquesta arquitectura fa que els contenidors siguin extremadament lleugers. Mentre que una màquina virtual pot ocupar gigabytes i trigar minuts a arrencar, un contenidor pot ocupar megabytes i arrencar en segons, o fins i tot mil·lisegons. Això és el que els fa tan atractius: podeu tenir desenes o fins i tot centenars de contenidors executant-se al mateix servidor on només podríeu tenir unes poques màquines virtuals.

Un contenidor encapsula tot el que l'aplicació necessita: el codi de l'aplicació, les llibreries de les que depèn, les eines del sistema que utilitza, i la configuració necessària. Per exemple, si teniu una aplicació web en Python que usa Flask i necessita PostgreSQL, el contenidor contindria Python, Flask, i tot el codi de la vostra aplicació. La base de dades PostgreSQL probablement estaria en un altre contenidor separat, però parlarem d'això més endavant.

Què és una imatge Docker?

Si un contenidor és l'aplicació en execució, una imatge és la plantilla o el motlle a partir del qual es creen els contenidors. És com la diferència entre una recepta de cuina i el plat cuinat. La recepta (la imatge) descriu tots els ingredients i passos necessaris, mentre que el plat cuinat (el contenidor) és el resultat d'executar aquesta recepta.

Una imatge és un fitxer de només lectura que conté tot el necessari per executar l'aplicació: el sistema operatiu base (normalment una versió minimalista de Linux), l'aplicació, les dependències, i la configuració. Les imatges s'organitzen en capes, com si fossin les capes d'una ceba. Cada capa afegeix alguna cosa: la primera capa podria ser el sistema operatiu base, la segona instal·la Python, la tercera instal·la les llibreries necessàries, la quarta copia el vostre codi, etc.

Aquest sistema de capes és molt eficient. Si dues imatges comparteixen les primeres capes (per exemple, totes dues usen Ubuntu com a base), Docker només emmagatzema aquestes capes una vegada i les reutilitza. Això estalvia molt espai i fa que descarregar noves imatges sigui més ràpid.

Les imatges no canvien mai. Un cop creada, una imatge és immutable. Si voleu canviar alguna cosa, heu de crear una nova imatge. Aquesta immutabilitat és una característica molt important perquè garanteix que el que funciona avui continuarà funcionant demà exactament de la mateixa manera.

La relació entre imatges i contenidors

La relació entre imatges i contenidors és com la que hi ha entre un programa instal·lat i un procés en execució. Quan feu doble clic a una aplicació del vostre ordinador, el sistema operatiu carrega el programa des del disc i crea un procés en execució. De la mateixa manera, quan arrenqueu un contenidor, Docker carrega una imatge i crea un contenidor en execució basat en aquesta imatge.

Una diferència important és que podeu crear múltiples contenidors a partir de la mateixa imatge. Per exemple, si teniu una imatge d'un servidor web NGINX, podeu crear 10 contenidors diferents tots basats en aquesta mateixa imatge. Cadascun d'aquests contenidors serà independent i tindrà el seu propi sistema de fitxers (tot i que inicialment seran idèntics), el seu propi espai de xarxa, i els seus propis processos.

Quan un contenidor fa canvis al sistema de fitxers (per exemple, escriu logs o crea fitxers temporals), aquests canvis només existeixen mentre el contenidor està en execució. Si atureu i elimineu el contenidor, tots aquests canvis es perden. La imatge original es manté intacta. Això és el que anomenem "efímer": els contenidors estan dissenyats per ser temporals. Si voleu que les dades persisteixin, heu d'utilitzar volums, que són un mecanisme especial per emmagatzemar dades fora del contenidor, però això ho veurem més endavant.


Comparant Docker amb altres tecnologies: màquines virtuals vs contenidors

Molts alumnes em pregunten: "Si Docker és com una màquina virtual, per què no simplement utilitzem VMware o VirtualBox?" És una bona pregunta, i entendre les diferències us ajudarà a comprendre per què Docker ha tingut tant d'èxit.

Com funcionen les màquines virtuals

Una màquina virtual és, literalment, un ordinador simulat dins d'un altre ordinador. Quan creeu una màquina virtual, esteu creant un sistema operatiu complet amb el seu propi kernel, els seus propis drivers, i tots els seus serveis. Aquest sistema operatiu "guest" (convidat) s'executa damunt d'un hypervisor, que és el programari que s'encarrega de l'emulació (com VMware, VirtualBox, o Hyper-V).

L'avantatge d'aquest enfocament és que teniu aïllament complet: cada màquina virtual és totalment independent i no pot afectar altres màquines virtuals ni el sistema amfitrió. També podeu executar diferents sistemes operatius: podeu tenir Linux, Windows, i altres sistemes funcionant simultàniament al mateix servidor físic.

Però té desavantatges importants. Cada màquina virtual necessita els seus propis recursos: si voleu executar 10 màquines virtuals, necessiteu suficient RAM per 10 sistemes operatius complets, suficient espai de disc per 10 sistemes complets, etc. Això és molt ineficient. A més, arrencar una màquina virtual és lent: pot trigar diversos minuts fins que el sistema operatiu està completament carregat i llest per funcionar.

Com funcionen els contenidors Docker

Els contenidors adopten un enfocament completament diferent. En lloc d'emular un ordinador complet, utilitzen funcionalitats del kernel de Linux (namespaces i cgroups) per crear entorns aïllats. Tots els contenidors comparteixen el mateix kernel del sistema operatiu amfitrió, però cada contenidor té el seu propi espai aïllat de processos, xarxa, sistema de fitxers, etc.

Això fa que els contenidors siguin extremadament lleugers. Mentre que una màquina virtual pot ocupar diversos gigabytes i utilitzar gigabytes de RAM, un contenidor pot ocupar només desenes de megabytes i utilitzar molt poca memòria. Un contenidor pot arrencar en menys d'un segon, mentre que una màquina virtual triga minuts.

La contrapartida és que tots els contenidors han de compartir el mateix tipus de kernel. En un sistema Linux, només podeu executar contenidors Linux. No podeu executar contenidors Windows natívament en Linux (tot i que Docker Desktop ho soluciona utilitzant una màquina virtual internament quan cal).

Quan utilitzar cada tecnologia

Les màquines virtuals encara tenen el seu lloc. Són ideals quan necessiteu aïllament fort per seguretat, quan heu d'executar diferents sistemes operatius, o quan treballeu amb aplicacions legacy que necessiten un entorn específic de sistema operatiu. Moltes organitzacions utilitzen màquines virtuals per aïllar diferents projectes o clients.

Els contenidors són millors quan voleu eficiència, velocitat, i la capacitat de desplegar aplicacions ràpidament. Són ideals per microserveis, on podeu tenir desenes o centenars de petits serveis diferents, cadascun en el seu propi contenidor. També són perfectes per entorns de desenvolupament: podeu tenir un contenidor amb una versió específica de Node.js per un projecte, i un altre contenidor amb una versió diferent per un altre projecte, sense que entrin en conflicte.

De fet, moltes empreses utilitzen ambdues tecnologies juntes: tenen màquines virtuals per aïllar grans unitats de treball, i dins de cada màquina virtual executen múltiples contenidors per les aplicacions individuals. És el millor dels dos móns.