Linux és un sistema operatiu que permet aïllar un procés de tots els recursos del sistema com la cpu, memoria, sistema de fitxers, etc.
On this page
Introducció
A diferència de les màquines virtuals que necessiten un Hypervisor, els contenidors s’executen directament en el sistema operatiu i fan servir capacitats que proporciona directament el kernel de linux.

Entorn de treball
Crea una màquina Ubuntu i instal·la docker:
| Pots crear una màquina local amb Windows Subsystem for Linux (WSL):
O una màquina al núvol amb Isard
Contenidor
Executar un contenidor és molt fàcil:
Pots veure que docker baixa la imatge hello-world i executa un contenidor amb aquesta imatge.
A diferència de les màquines virtuals, els contenidors Docker no utilitzen cap virtualització de maquinari.
Cada contenidor s’executa en un espai aïllat, però tots comparteixen el mateix sistema operatiu.
A continuació anem a verificar aquesta afirmació amb el servidor web Nginx!
Verifica que no s’està executant cap procés nginx:
| Instal.la nginx amb apt:
Pots veure que el servidor web és accessible a http://localhost:
També que s’estan executant 5 processos nginx, 1 master i 4 workers:
|
; ;
El número de processos worker variará en funció del número de nuclis de processament del processador.
Elimina nginx i verifica que ja no hi ha cap procés “nginx”:
&&
| A continuació executarem un servidor nginx mitjançant un contenidor:
Les opcions que hem fet servir amb docker run són:
--rm: quan es pari el contenidor, el contenidor s’esborrarà-d: que el contenidor s’executi en segon plà--name web_server: li posem un nom al contenidor
Amb la comanda docker ps pots veure tots els contenidors que estan en execució:
Pots veure que s’han arrencat 5 processos nginx en el meu sistema operatiu (no hi ha cap virtualització):
|
;
I pots veure que el servidor web no és accessible a http://localhost:
Anem a mirar amb Nmap que no estigui escoltant a un altre port:
Espai aïllat
Un contenidor s’executa en un espai aïllat que més endavant veurem com es pot anar obrint.
De moment entrarem “dins” del contenidor per poder veure el sistema operatiu tal com el veuen els processos que s’estan executant dins el contenidor.
Amb aquesta comanda exeutem (exec) bash en el contenidor amb nom web_server en una sessió interactiva (-it):
Dins del contenidor pots veure que el sevidor web és accesible:
Canvia el contingut de la pàgina d’inici perquè sigui més curta i personal:
Surt del contenidor i verifica que el fitxer usr/share/nginx/html/index.html s’ha modificat:
El fitxer no existeix! Que ha passat?
Tornem a entrar dins el contenidor, potser s’ha esborrat …
Pots veure que el fitxer existeix dins el contenidor, però no fora del contenidor.
I també que la vida del fitxers creats o modificats dins el contenidor està lligat a la vida del contenidor.
Crea un nou fitxer, surt del contenidor, para el contenidor (s’eliminarà perquè l’hem creat amb l’opció --rm) i torna a crear-lo de nou per veure que tots els canvis han desaparegut:
|
PID Namespace
Dins del contenidor anem a veure tots els procesos que s’estan executant:
Resulta que el el contenidor no pot accedir a l’executable ps del sistema de fitxers del sistema operatiu!
Doncs haurem d’instal.lar el paquet procps dins el contenidor:
root@6b9c24819095:/# apt update
root@6b9c24819095:/# apt install -y procpsDins el contenidor sudo no funciona perquè quan entres al contenidor ets l’usuari root, però només dins el contenidor.
Ja podem veure quins processos estan en execució:
;
Pots veure que dins el contenidor només s’estan executant els processos nginx i els de la sessió.
A més, el PID dels processos nginx no coincideixen amb els que haviem vist abans fora del processador.
I encara més sospitós, el procés amb el PID 1, el primer en executar-se en arrancar el sistema operatiu és el nginx master!
Sortim del contenidor amb l’ordre exit i tornem a mirar des de fora del contenidor quins són els processos nginx que estan en execució:
|
;
Encara que el PID (i el USER) sigui diferent en tot el demés sembla que són els mateixos processos.
El COMMAND és el mateix, els valors VSZ (Virtual Memory Size) i RSS (Resident Set Size) són iguals, l’ START coincideix, etc.
Però en informàtica s’aprén provant coses i experimentant, i la manera més fàcil d’estar segurs és eliminar un procés a veure que passa.
Elimina el procés 26838:
Si ara mirem els processos que s’executen dins el contenidor veurás que el procés 32 també s’ha eliminat, i ha aparegut un procés que abans no estava, el 250:
;
Aquest cop no hem iniciat una sessió interactiva sinó que ens hem limitat a executar la comanda dins de l’espai del contenidor.
Com hem dit abans, nginx és un servidor web que executa un master procés, que s’encarrega d’executar dos o més worker procés que gestionen les sol.licitus web.
Si un worker process deixa de funcionar o ha de canviar la configuració, el master process executarà altres worker process.
Per estar segurs elimina tots els worker process de nginx, pero ara desde el mateix contenidor:
;
Desde fora del contenidor també podem veure que s’han crear processos nginx worker nous:
|
;
I per acabar de confirmar el que ja sabem anem a matar el procés amb el PID 1 del contenidor desde fora del contenidor:
|
Pots veure que tots els processos nginx han desaparegut!
També en el contenidor?
El contenidor ha deixat d’existir!
Si matem el próces amb PID 1 és el que passa.
Pots confirmar amb l’ordre docker ps que ho hi ha cap contenidor amb el nom web_server:
Activitats
1.- Instal.la el servidor web Apache amb apt, crea de nou el contenidor web_server i verifica que desde dins el contenidor no pots matar el procés apache.
2.- Elimina el servidor apache, crea un nou contenidor web_apache amb la imatge httpd2 i verifica que desde el contenidor web_server no pots matar al contenidor web_apache i al revés tampoc.
3.- Explica els resultats obtinguts.
Només puc matar un procés si tinc el seu PID, però dins del contenidor …
TODO Acabar de revisar i completar
Control de contenidors
Creació i posada en marxa d’un nou contenidor
Un contenidor es crea a partir d’una imatge.
Per defecte aquesta imatge es descarrega de Docker Hub.
Per exemple, aquí tens la informació de nginx: nginx - Official Image | Docker Hub
Quan executes aquesta ordre, docker baixa la imatge especificada (si no la té guardada), i instal.la i inicia un contenidor amb nginx:
Pots veure que el contenidor retorna un hash criptogràfic (veure Criptografia) que és l’identificador del contenidor.
Cada vegada que executes docker run i crees un contenidor nou, aquest nou contenidor obtindrà un identificador únic.
Encara que l’identificador únic és molt útil molts cops volem poder anomenar un contenidor per un nom concret.
Per això passem el flag --name web
Com que volem que el contenidor s’executi en segon pla passem també el flag -d ( o --detach)
Pots comprovar que hi ha un contenidor en execució anomenat web executant-se al port 80/tcp amb l’ordre docker ps:
Execució de contenidors interactius
Si vols executar un contenidor de manera interactiva has d’utilitzar el flag -it:
Enlloc de -it també pots escriure --interactive --tty, però -it és molt més curt.
El flag --interactive diu a Docker que mantingui el flux d’entrada estàndard (stdin) obert per al contenidor encara que no hi hagi cap terminal connectat.
El flag --tty indica a Docker que assigni un terminal virtual per al contenidor, que us permetrà passar senyals al contenidor. Això és normalment el que voleu d’un programa interactiu de línia d’ordres.
Normalment utilitzem els dos flags quan executem un programa interactiu, com ara un shell.
També has especificat el programa que s’executarà dins del contenidor. En aquest cas, has executat un programa shell anomenat bash.
Pots executar qualsevol programa que estigui disponible dins del contenidor.
systemd
Com que estás en un contenidor fedora, encara que estiguis en un sistema operatiu ubuntu les coses són diferents.
Per exemple ja no tens apt:
En fedora és dnf:
Pots instal.lar un servidor Nginx amb el paquet rpm de Fedora 40 en un sistema operatiu Ubuntu!
Un contenidor no és una màquina virtual, i no puc arrencar nginx amb systemctl:
En un contenidor el procés amb PID 1 no és init sinó el que ve per defecte en el contenidor o el que tu dius al contenidor que executi, en el nostre cas bash.
Solució? Arrencar nginx manualment:
Amb l’ordre exit pots sortir del contenidor.
Al sortir del contenidor aquest s’atura.
Llistar, aturar, reiniciar i visualitzar la sortida dels contenidors
El primer que has de fer per provar la vostra configuració actual és comprovar quins contenidors s’estan executant actualment mitjançant l’ordre docker ps:
L’execució de l’ordre mostra la informació següent sobre cada contenidor en execució:
- L’identificador del contenidor
- La imatge utilitzada
- L’ordre executada al contenidor
- El temps des que es va crear el contenidor
- La durada que el contenidor ha estat en funcionament
- Els ports de xarxa exposats pel contenidor
- El nom del contenidor
Logs
Si vols veure el log d’un contenidor ho pots fer amb l’ordre docker logs indicant el nom o el id del contenidor:
Qualsevol cosa que el programa escriu a stdout o stderr s’enregistrarà en aquest registre.
El problema d’aquest és que el registre mai es gira ni es trunca per defecte, de manera que les dades escrites al registre d’un contenidor es mantindran i creixeran mentre el contenidor existeixi.
Si un contenidor ha d’estar molt temps funcionant és convenient utilitzar un volum pels logs (a Emmagatzematge s’explica que és un volum).
Amb l’ordre docker logs pots utilizar el flag --follow o -f, que et mostra els registres i després continua mirant i actualitzant la pantalla amb els canvis al registre a mesura que es produeixen.
Stop
L’ordre docker stop indica al programa amb PID 1 del contenidor que s’aturi.
Estat del contenidor
Un contenidor Docker es pot trobar en un d’aquests estats:

Per començar elimina tots els contenidors:
A continuació crea un contenidor:
💡 El contenidor que hem creat no apareix a la llista de contenidors perquè per defecte docker ps només mostra contenidors que estan executant-se.
Per veure tots els contenidors (inclosos els que hi estan en estat creat) utilitza l’opció -a:
Pots arrencar un contenidor aturat amb l’ordre docker start:
Si vols crear i arrencar un contenidor amb una sola ordre pots executar docker run com has estat fent fins ara.
remove
La facilitat d’esborrar tot de manera molt fàcil és un dels motius importants pels quals es fa servir docker.
Un contenidor està confinat, només has d’identificar el contenidor que vols aturar i/o eliminar.
💡 Recorda que per enumerar tots els contenidors del teu ordinador has d’executar l’ordre docker ps -a:
Ja pots eliminar el contenidor indicant el nom (si en té) o l’ID (només cal els primers digits):
💡 Per a eliminar un contenidor aquest ha d’estat aturat (els processos que s’executen dins el contenidor han d’estar aturats).
- Pots executar l’ordre
docker stopque envia una senyalSIG_HUPperquè els processos en execució tinguin temps per realitzar tasques de finalització i neteja.
El temps estàndard màxim d’aturada és de 30 segons.
- Pots executar l’ordre
docker rm -f.
En aquest cas s’envia un senyal SIG_KILL que finalitza immediatament els processos en execució.
Es pot produir una corrupció de fitxers o no terminar correctament una connexió web.
Eliminació automàtica
Si vols executar un contenidor que s’elimini de manera automàtica quan s’atura pots utilitzar el flag --rm.
Per exemple, si no tinc instal.lat nmap i vull escanejar una xarxa sense tenir que instal.lar nmap (veure Nmap), pots executar nmap mitjançant un contenidor.
Si vols eliminar tots els contenidors pots executar aquesta comanda:
Si no hi ha cap contenidor dóna error (cap problema).
Reinici automàtic dels contenidors
Una estratègia bàsica per recuperar-se d’errors temporals és reiniciar automàticament un procés quan aquest finalitza de manera inesperada.
Quan crees un contenidor pots utilitzar l’opció --restart per dir a docker que ha de fer quan s’atura un contenidor.
Si executo aquest contenidor l’únic que fa és imprimir la data i s’atura:
Si vull que mai s’aturi puc utilitzar l’opció --restart always:
En principi sembla que no hi ha diferència, excepte que si mires els contenidor que estan actius pots veure que segueix actiu perquè docker no para de torna a arrencar-lo:
Altre cosa és que ja no pugui enviar la data al terminal.
Per saber totes les opcions mira Running containers
Variables d’entorn
Les variables d’entorn són parells clau/valor que es posen a disposició dels programes a través del seu context d’execució.
Et permet canviar la configuració d’un programa sense modificar cap fitxer ni canviar l’ordre utilitzada per iniciar el programa.
Si vols passar una variable d’entorn a un contenidor pots utilitzar l’opció --env:
Activitat
La distribució Ubuntu fa servir el kernel Linux i afegeix una sèrie de fitxers i llibreries per crear una distribució concreta.
Anem a veure com era Ubuntu 14.04:
Aquesta comanda baixa una imatge ubuntu:14.04, arrenca un contenidor, dins del contenidor executa la comanda /bin/bash i obre un terminal amb una sessió interactiva amb el contenidor (es semblant a un ssh).
Instal.la el servidor apache, verifica que funciona i mira quina era l’última versió que es podia instal.lar a Ubuntu 14.04.
Des de dins del contenidor et pots connectar al servidor apache:
Però que passa en el host, fora del contenidor?
Obre una altre sessió interactiva amb la màquina virtual i verifica que el contenidor està actiu:
Si fem un curl a localhost no obtenim cap resposta:
El servidor apache del contenidor no està escoltant al nostre localhost, sinó en un altre localhost.
A Xarxa veurem com funciona el confinament de xarxa.
Podem verificar que el servidor Apache no està instal.lat fora del contenidor:
Quam hem instal.lat apache, s’ha descarregat un conjunt de fitxers que s’han superposat als fitxers existents mitjançant una capacitat dels Linux que és diu UnionFS.

A Emmagatzematge veurem com funciona el confinament de fitxers.
Si fas un ps pots verificar que apache2 s’està executant:
|
Un contenidor no és una màquina virtual, el que fa Linux és aïllar els processos del host dels processos del contenidor.
Executa ps dins el contenidor i verifica que el contenidor no tè accés al processos del host:
A més pots veure que el PID dels tres processos apache no coincideix encara que són els mateixos processos.

Elimina un procés al contenidor i verifica que també s’elimina al host