<commit_before># Docker

## Qué ès?

Com les màquines virtuals serveix per aillar processos.
A diferència de les MV's, no duplica recursos.

Es basa en dues tecnologies de Linux:

- cgroups: per limitar els recursos (memoria, cpu...) dels processos
- namespaces: Limita l'avast que pot veure el procés (altres processos, xarxa, sistema de fitxers...)

Docker afegeix una capa per sobre:

- Aporta una forma uniforme de definir i accedir a les aplicacions

## Containers

Creem una container interactiu (-it) de docker, basant-nos en una imatge d'Ubuntu.

```bash
docker run -it ubuntu
```

- Executa una comanda dintre d'un sistema de fitxers "copiat" de la imatge.
- Les modificacions que fem sobre el sistema de fitxers no afecten a altres instancies d'ubuntu que llencem.
- Els processos que llencem a dintre son visibles des de el sistema pare, pero no al reves.
- Quan termina el proces (en aquest cas es bash, per defecte) la imatge creada queda parada (no es destrueix)
- Des de fora podem parar el process amb `docker stop 451bccb8de1c`

```bash
docker ps -a  # L'opció -a es per veure tambe els que estan parats
CONTAINER ID   IMAGE    COMMAND   CREATED         STATUS                      PORTS     NAMES
5fabbdd99c65   ubuntu   "bash"    5 minutes ago   Exited (0) 5 minutes ago              heuristic_lamarr
```

Podem fer servir tant els id's com els noms per referir-nos a les instàncies.

```bash
docker log 5fabbdd99c65 # ens mostra la sortida estandard del procés principal, util sobretot si no l'hem executat interactiu o hem sortit
docker log -f 5fabbdd99c65 # 'follow' sigue monitorizando lo que sale despues
docker stop 5fabbdd99c65
docker start -i 5fabbdd99c65 # para arrancarlo otra vez
docker rm 5fabbdd99c65 # para borrarlo definitivamente del sistema
docker run -it ubuntu # volveria a arrancar uno diferente
```

## Imatges

Les imatges de partida les trobem a la web [Docker Hub](https://hub.docker.com/explore)

```bash
docker images # Llista les imatges descarregades
```

Las images tienen tags (versiones)

## Dockerfile

```docker
FROM scratch
ADD mytarball.tar.gz
RUN tar xvfz mytarball.tar.gz
COPY file /var/www/html
CMD ['/bin/bash']
```

- `FROM` es la imagen de base  imagen:tag
- `ADD` copia del sistema de ficheros local a dentro del container
- `RUN` ejecuta comando dentro del container
- `ENV` establece una variable de entorno para los comandos que se ejecuten (Sobrescribible desde fuera)
- `CMD` fija el comando inicial, es una array estilo argv (elemento por parametro)
	- Sobreescribible por cli con el parametro del run
- `ENTRYPOINT` fija el comando para arrancar el comando inicial `sh -c`
	- Sobreescribible por cli con `--entrypoint`
- `LABEL` metadata de la imagen  mylabel="value"a
- `WORKDIR` cambia al directorio para los siguientes comandos

Per a executar el Dockerfile

```bash
docker build -t myapp .
```

La imatge es dirà _myapp_

```bash
docker run -it --rm myapp -p8000:80
```

- Per obrir i mapejar  ports -pOUTER:INNER
- Per esborrar el container en acabar el run, `--rm`
- `-f mydockerfile` si el fichero no se llama `Dockerfile` (por ejemplo para tener varios en un directorio)

## Environ

Patron util usar las variables de entorno para modificar la configuración.

- Se usa ENV en el Dockfile para definir el valor por defecto
- Se sobrescribe en CLI docker run con la opcion `-e VAR=value`
- Se usa en los ficheros copiados substituyendo ${VAR}
- TODO: No he entendido muy bien esto


## Cache

Docker crea capas cada comando sacando el id.
Se reaprovechan los pasos de anteriores ejecuciones.
Interesa poner abajo los comandos que más a menudo vayan a alterar la imagen

## Multistage build

Útil per a no incloure a la imatge final tot el que cal per construir l'aplicació,
com ara l'es eines de build i les dependencies de desenvolupament (composer, babel, cython...).

Construim l'aplicació en una imatge i després copiem els fitxers construits a l'imatge final.

```dockerfile
# Partim d'una imatge amb les eines de construcció
FROM composer AS dependencies<commit_msg>docker: updates<commit_after># Docker

## Qué ès?

Com les màquines virtuals serveix per aillar processos.
A diferència de les MV's, no duplica recursos.

Es basa en dues tecnologies de Linux:

- cgroups: per limitar els recursos (memoria, cpu...) dels processos
- namespaces: Limita l'avast que pot veure el procés (altres processos, xarxa, sistema de fitxers...)

Docker afegeix una capa per sobre:

- Aporta una forma uniforme de definir i accedir a les aplicacions

## Containers

Creem una container interactiu (-it) de docker, basant-nos en una imatge d'Ubuntu.

```bash
docker run -it ubuntu
```

- Executa una comanda dintre d'un sistema de fitxers "copiat" de la imatge.
- Les modificacions que fem sobre el sistema de fitxers no afecten a altres instancies d'ubuntu que llencem.
- Els processos que llencem a dintre son visibles des de el sistema pare, pero no al reves.
- Quan termina el proces (en aquest cas es bash, per defecte) la imatge creada queda parada (no es destrueix)
- Des de fora podem parar el process amb `docker stop 451bccb8de1c`

```bash
docker ps -a  # L'opció -a es per veure tambe els que estan parats
CONTAINER ID   IMAGE    COMMAND   CREATED         STATUS                      PORTS     NAMES
5fabbdd99c65   ubuntu   "bash"    5 minutes ago   Exited (0) 5 minutes ago              heuristic_lamarr
```

Podem fer servir tant els id's com els noms per referir-nos a les instàncies.

```bash
docker log 5fabbdd99c65 # ens mostra la sortida estandard del procés principal, util sobretot si no l'hem executat interactiu o hem sortit
docker log -f 5fabbdd99c65 # 'follow' sigue monitorizando lo que sale despues
docker stop 5fabbdd99c65
docker start -i 5fabbdd99c65 # para arrancarlo otra vez
docker rm 5fabbdd99c65 # para borrarlo definitivamente del sistema
docker run -it ubuntu # volveria a arrancar uno diferente
```

## Imatges

Les imatges de partida les trobem a la web [Docker Hub](https://hub.docker.com/explore)

```bash
docker images # Llista les imatges descarregades
```

Las images tienen tags (versiones)

## Dockerfile

```docker
FROM scratch
ADD mytarball.tar.gz
RUN tar xvfz mytarball.tar.gz
COPY file /var/www/html
CMD ['/bin/bash']
```

- `FROM` es la imagen de base  imagen:tag
- `ADD` copia del sistema de ficheros local a dentro del container
- `RUN` ejecuta comando dentro del container
- `ENV` establece una variable de entorno para los comandos que se ejecuten (Sobrescribible desde fuera)
- `CMD` fija el comando inicial, es una array estilo argv (elemento por parametro)
	- Sobreescribible por cli con el parametro del run
- `ENTRYPOINT` fija el comando para arrancar el comando inicial `sh -c`
	- Sobreescribible por cli con `--entrypoint`
- `LABEL` metadata de la imagen  mylabel="value"
	- maintaner, application...
- `WORKDIR` cambia al directorio para los siguientes comandos

Per a executar el Dockerfile

```bash
docker build -t myapp .
```

La imatge es dirà _myapp_

```bash
docker run -it --rm myapp -p8000:80
```

- Per obrir i mapejar  ports -pOUTER:INNER
- Per esborrar el container en acabar el run, `--rm`
- `-f mydockerfile` si el fichero no se llama `Dockerfile` (por ejemplo para tener varios en un directorio)

## Environ

Patron util usar las variables de entorno para modificar la configuración.

- Se usa ENV en el Dockfile para definir el valor por defecto
- Se sobrescribe en CLI `docker run` con la opcion `-e VAR=value`
- Los programas lo cogen usando 
- Se usa en los ficheros copiados substituyendo ${VAR}

## Cache

- Docker crea capas cada comando sacando el checksum como id.
- Se reaprovechan los pasos de anteriores ejecuciones.
- Interesa poner abajo los comandos que más a menudo vayan a alterar la imagen.
- Puede interesarnos juntar varias sentencias RUN con `&&` para reducir las capas

## Multistage build

Útil per a no incloure a la imatge final tot el que cal per construir l'aplicació,
com ara l'es eines de build i les dependencies de desenvolupament (composer, babel, cython...).

Construim l'aplicació en una imatge i després copiem els fitxers construits a l'imatge final.

```dockerfile
# Partim d'una imatge amb les eines de construcció
FROM composer AS dependencies
{'fraction_non_alphanumeric': 0.06592871913392531, 'fraction_numerical': 0.01070429388152293, 'mean_word_length': 3.891136228435455, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6999536', 'n_tokens_mistral': 2950, 'n_tokens_neox': 2762, 'n_words': 1197}