---
# System prepended metadata

title: Docker
tags: [' docker', daw, ' M8']

---

---
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.
