--- title: Docker tags: daw, docker, M8 --- <div style="width: 30%; margin-left: auto;"> ![](https://hackmd.io/_uploads/HJiR4eGJT.png) ![image](https://hackmd.io/_uploads/By3ai4Bolx.png) </div> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Llicència de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />Aquesta obra està subjecta a una llicència de <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Reconeixement-CompartirIgual 4.0 Internacional de Creative Commons</a> # Docker ## Què és Docker? Docker és una aplicació informàtica que permet encapsular una aplicació i totes les seves dependències en un entorn aïllat anomenat 'contenidor'. De manera informal podem pensar en Docker com una solució intermitja entre una màquina virtual i la comanda chroot de Linux. Explicat d'una manera més tècnica, són processos aïllats de la resta de processos de la màquina hoste mitjançant [Linux namespaces](https://en.wikipedia.org/wiki/Linux_namespaces) i [cgroups](https://en.wikipedia.org/wiki/Linux_namespaces).(Veure: [Virtualització a nivell de sistema operatiu.](https://en.wikipedia.org/wiki/OS-level_virtualization)) Podem executar diversos 'contenidors' en una mateixa màquina i estar relativament segurs de que la nostra aplicació es comportarà igual en qualsevol hoste que la executi. ## Arquitectura. Docker utilitza una arquitectura client-servidor. El client Docker realitza peticions al servidor Docker que és el que realitza la feina en un segon pla. Aquesta comunicació es realitza mitjançant una API-REST sobre una interface de xarxa. Que es comuniquin a través d'una API REST no exclou que podem còrrer el client i el servidor al mateix equip. __Nota:__ _'Docker Compose'_ és un altre client més pensat per a treballar amb conjunts de contenidors. ### Components: * Servei (daemon) Docker (dockerd): És el programa que escolta les peticions API i gestiona els objectes Docker: imatges, contenidors, volums i xarxes. A la seva vegada es pot comunicar amb d'altres serveis docker. * Client Docker (docker): És l'eina més sencilla que té l'usuari d'interacciónar amb Docker a través de l'API. * Docker Desktop: És un paquet d'aplicacions que permet als usuaris de Windows i Mac utilitzar Docker. Conté: dockerd, docker, Docker compose, Kubernetes i alguna altra utilitat. * Registres Docker: Sòn magatzems d'imatges de Docker. * Objectes Docker: * Imatges: Una imatge és una _'plantilla'_ de només lectura amb instruccions per a crear un contenidor Docker. Fent una analogia amb el paradigma de programació orientada a objectes les imatges serien com les __classes__ i els contenidors com els __objectes__. * Contenidors: Són les instàncies executables de les imatges. Els podem crear, arrencar, aturar, moure o esborrar utilitzant la API Docker. Els contenidors es poden connectar a una o més xarxes, afegir-lis emmagatzematges o inclús crear noves imatges basades en el seu estat actual. Els contenidors són portables, es a dir, es poden executar en qualsevol sistema operatiu. ## Exemple: La següent comanda arrenca un contenidor amb la imatge oficial d'Apache. ``` bash docker run --name apache-daw \ -d \ -p 8080:80 \ -v ~/apache-docker/html:/usr/local/apache2/htdocs/ \ httpd:2.4 ``` ### Explicació dels paràmetres: - docker run: indica que volem iniciar un contenidor. - -d : L'opció detached (-d | --detach) executa el contenidor en segon pla i mostra per consola la seva id. - -p 8080:80 : L'opció publish/expose (-p| --expose) connecta un port del contenidor amb un port del host. En aquest exemple quan iniciem una connexió al port 8080 del host ens respon el port 80 del contenidor. - -v ~/apache-docker/html:/usr/local/apache2/htdocs/ : L'opció volume (-v | --volume) vincula un directori del host amb una ruta del contenidor. En aquest cas, el contingut de la carpeta "~/apache-docker/html" del host és el que el contenidor troba quan accedeix al path: "/usr/local/apache2/htdocs/". Molt útil per a que el contenidor utilitzi dades que es troben al host. Un paràmetre que no utilitza aquest exemple però que és molt útil quan executem contenidors, és el paràmetre (-e | --env) que permet definir variables d'entorn al contenidor o sobrescriure-les si ja existien a la imatge. Per exemple: `--env VAR1=value1 --env VAR2=value2` crea o sobrescriu les variables d'entorn VAR1 i VAR2 al contenidor.