# Docker/Dockerfile

* Introduction
* Gestion des conteneurs
* Dockerfile
* Docker compose
* Kubernetes
* Problèmes connus
* Introduction
* Gestion des conteneurs
* Dockerfile
* Docker compose
* Kubernetes
* Problèmes connus
[ Modifier le sommaire ]
Une fois le processus Docker lancé, on peut commencer à lui demander de construire des conteneurs, de zéro ou à partir d'images d'un registre.

## Rôle

Il existe deux sortes de conteneur :
* Celui issu d'une image téléchargée et utilisée telle qu'elle.
* Celui construit avec des instructions personnalisées.
Par convention, les instructions pour construire un conteneur sont écrites dans un fichier appelé "Dockerfile". Il est recommandé de les placer dans un dépôt Git pour les versionner.

## Commandes Dockerfile

Les commentaires sont précédés du croisillon (#).

### ADD

Permet de copier des fichiers ou dossiers de la machine hôte vers le conteneur.
Les Dockerfile n’ont jamais accès aux volumes de l'hôte, sauf dans l’ENTRYPOINT.

### ARG

Crée une variable qui sera accessible dans la première image (FROM). Ex :
Éviter d'utiliser ce système pour bénéficier du build cache : ainsi Docker ne retéléchargera pas toutes les dépendances du Dockerfile lors du changement d'une variable située en début de Dockerfile, et n'affectant qu'une seule d'entre elles.

### CMD

Commande à exécuter au lancement du conteneur.

### COPY

Copie des fichiers ou dossiers de la machine hôte vers le conteneur. Ainsi, l'image les embarquera (contrairement à s'ils étaient montés dans un volume).
Ex :
La différence avec ADD est qu'il ne prend pas en compte les décompression de .tar et les URLs distantes.

### ENTRYPOINT

Nom d'un fichier exécutable (par exemple en shell) qui s'exécutera après chaque lancement du conteneur.
Ex :
Le fichier exécuté par l'entrypoint est le principal moyen d'accéder à la machine hôte, puisque le Dockerfile ne peut pas (en dehors de COPY qui peut la lire sans y écrire).

### ENV

Crée une variable d'environnement accessible à toutes les images du Dockerfile.

### EXPOSE

Ouvre le port logiciel mentionné du conteneur.

### FROM

Part d'une image Docker pour en créer une autre qui la complète.
Cela permet par exemple le multistage build : se servir d'une première image comme builder volumineux (avec des sources, des dépendances nécessaires à des installations), duquel on copie seulement les fichiers à utiliser dans une autre image plus légère, qui sera montée en conteneur.

### LABEL

Ajoute une description à une image.

### RUN

Lance une commande. Ex :

### STOPSIGNAL

Signal d'arrêt à envoyer au conteneur, au format nombre ou nom. Par exemple SIGKILL pour le tuer.

### USER

Se connecte à l'utilisateur et mot de passe en paramètre pour lancer les instructions RUN, CMD ou ENTRYPOINT.
Par ailleurs, pour que le conteneur possède les permissions de l'utilisateur courant :

#### Utilisation dans Docker Compose

Puis au lancement :
La présence de l'opérateur ":" dans les accolades signifie que l'on bascule vers cet utilisateur si la variable est inconnue du .env. Par exemple pour utiliser l'UID 1000 si UID= n'est pas renseigné dans le .env :

### VOLUME

Point de montage accessible par l'hôte et les autres conteneurs.
Il existe aussi des volumes anonymes non accessibles par la machine hôte et supprimés quand on supprime le conteneur.

### WORKDIR

Définit le répertoire de travail, c'est-à-dire celui à partir duquel les commandes partent (ex : pwd), y compris quand on se connecte au conteneur après son montage.
Équivalent à docker --workdir.

## .dockerignore

Un fichier .dockerignore peut être placé dans un dépôt pour que son conteneur ignore le contenu qui y figure lors des commandes ADD et COPY. Exemple pour Symfony :

## Bonnes pratiques

Voir https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

## Exemples
### Apache avec PHP7.1

Voici un exemple de serveur Apache avec PHP7.1 pour MediaWiki :

### Nginx avec PHP-FPM 8.2
## Références

* ↑ https://docs.docker.com/engine/reference/builder/#add
* ↑ https://docs.docker.com/engine/reference/builder/#copy
* ↑ https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy
* ↑ https://docs.docker.com/engine/reference/builder/#entrypoint
* ↑ https://docs.docker.com/engine/reference/builder/#env
* ↑ https://docs.docker.com/engine/reference/builder/#expose
* ↑ https://docs.docker.com/engine/reference/builder/#from
* ↑ https://docs.docker.com/develop/develop-images/multistage-build/
* ↑ https://docs.docker.com/engine/reference/builder/#label
* ↑ https://docs.docker.com/engine/reference/builder/#user
* ↑ https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15
* ↑ https://docs.docker.com/engine/reference/builder/#volume
* ↑ https://www.geeksforgeeks.org/what-is-anonymous-volume-in-docker/
* ↑ https://snyk.io/blog/10-best-practices-to-containerize-nodejs-web-applications-with-docker/
* ↑ https://github.com/wikimedia/mediawiki-docker/blob/master/dev/Dockerfile