# Docker

# Installation Docker

L'installation de Docker est très simple, il suffit de lire et d'exécuter ce qui est décrit sur le site officiel de docker à [cette adresse](https://docs.docker.com/get-docker/).

<p class="callout success">Si tout est ok, passons à la suite avec le premier labo</p>

# Labo 1 - Premiers conteneurs, premières commandes

Voici la première commande :

```
sudo docker run --rm bash echo Salut
```

[![first command.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/Otw5rzmKsp00hCHz-first-command.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/Otw5rzmKsp00hCHz-first-command.png)

docker -&gt; nom de la commande qui permet de donner des ordres à docker  
run -&gt; c'est l'action qu'on demande à docker d'exécuter (ici on lui demande de créer et lancer un conteneur)  
\--rm -&gt; paramètre optionnel qui indique à docker que quand le conteneur aura terminé de s'exécuter, on veut qu'il soit supprimé - on parle bien du conteneur pas de l'image qui restera en cache sur notre ordinateur prête à être instanciée en un nouveau conteneur dès qu'on en aura besoin  
bash -&gt; c'est le nom de l'image   
echo Salut -&gt; commande à exécuter dans le conteneur

Commande suivant :

```
sudo docker images
```

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/vtf6OYrE2x515nuw-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/vtf6OYrE2x515nuw-capture.png)

images -&gt; demande l'affichage des images présentent localement dans le cache de notre serveur  
REPOSITORY -&gt; nom du dépôt d'où provient l'image  
TAG -&gt; identification d'un version spécifique d'une image   
IMAGE ID -&gt; identifiant unique d'une image  
CREATED -&gt; date de création de l'image  
SIZE -&gt; taille de l'image

Pour vérifier, chercher une version spécifique d'une image, se rendre sur le [hub de docker](https://hub.docker.com/search?q=&type=image)

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/hdKLNpILvsjQayqQ-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/hdKLNpILvsjQayqQ-capture.png)

Commande suivante :

```
sudo docker run -ti --rm bash
```

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/9G5ZvzJ2VkCPwlbc-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/9G5ZvzJ2VkCPwlbc-capture.png)

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/BpqwioDTEoxgbFLi-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/BpqwioDTEoxgbFLi-capture.png)

Nous avons accès à un terminal du conteneur avec clavier et écran

Dernière commande :

```
sudo docker ps
```

Liste les conteneurs en cours d'exécution avec des informations détaillées

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/1sUUgwmPDOcBYLMb-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/1sUUgwmPDOcBYLMb-capture.png)

# Labo 2 - Les IDs et la complétion Bash

Les IDs des conteneurs permettent de donner des ordres à un conteneur en spécifiant son id

```
sudo docker images
```

[![capture.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/vtf6OYrE2x515nuw-capture.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/vtf6OYrE2x515nuw-capture.png)

Je peux donc consulter les différentes couches qui composent mon image bash en tapant juste le début de son id

```
sudo docker history 39a
```

[![cpat.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/AaX7giN05U0eawsP-cpat.png)](https://192.168.1.221/uploads/images/gallery/2020-11/AaX7giN05U0eawsP-cpat.png)

On peut utiliser la complétion dans le shell pour afficher les commandes de docker

```
sudo docker<TAB>
```

[![captu.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/68wCgZai08TqIyLi-captu.png)](https://192.168.1.221/uploads/images/gallery/2020-11/68wCgZai08TqIyLi-captu.png)

Si la complétion ne fonctionne pas, il faut voir si le paquet bash-completion est bien installé. Si ce n'est pas le cas, l'installer, se déconnecter de la session et se reconnecter.

En tapant la commande suivante voici la liste des différentes commandes possibles de donner à docker :

```
sudo docker --help
```

[![capt.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/gtf2MzchdyHevZAh-capt.png)](https://192.168.1.221/uploads/images/gallery/2020-11/gtf2MzchdyHevZAh-capt.png)

# Labo 3 - Préserver les données

Il faut savoir que lorsque qu'un conteneur est supprimé, les modifications faites dans le conteneur disparaissent

Je créé un fichier fic dans mon conteneur, si j'ai mis l'option --rm en le lançant et que je quitte le conteneur, le fichier fic n'existe plus

[![05.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/OZUaIaMi6VR2rgRb-05.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/OZUaIaMi6VR2rgRb-05.png)

Si je refais la commande précédente en enlevant le --rm et que je quitte le conteneur, le fichier n'existe plus.

<p class="callout info">Il faut se rappeler que la commande docker run créé à chaque fois un nouveau conteneur</p>

Par contre si on utilise la commande suivante, on voit la liste des conteneurs créés mais non supprimés si on a pas mis l'option --rm

```
sudo docker ps -a
```

[![06.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/0DTp5dyHhoLLVjzw-06.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/0DTp5dyHhoLLVjzw-06.png)

Par contre nous pouvons utiliser un conteneur en status Exited (qui est créé mais qui ne tourne pas) :

Mais avant voyons les différentes options de cette commande :

sudo docker start --help

[![07.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/OMeCsIhbp57MJ4jb-07.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/OMeCsIhbp57MJ4jb-07.png)

Pour rentrer dans le conteneur et vérifier si le fichier est bien dedans :

```
sudo docker start -ai <CONTENAIR ID> ou <NAMES>
```

[![08.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/4pl6GT0NVScrHXI2-08.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/4pl6GT0NVScrHXI2-08.png)

<p class="callout info">Si la machine hôte, celle qui contient le docker engine, est redémarrée les conteneurs créés sans l'option --rm seront sauvegardés</p>

# Labo 4 - Les volumes

Nous pouvons monter des volumes dans un conteneur pour pouvoir interagir entre le système de fichiers de la machine hôte et celui du conteneur.

Créons un fichier dans la machine hôte

```
sudo echo OK > fic
```

[![09.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/ywpMyA0O10oYGlSR-09.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/ywpMyA0O10oYGlSR-09.png)

Voilà comment monter le volume courant accessible depuis le conteneur :

```
sudo docker run -ti --rm -v $(pwd):/texte bash
```

[![10.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/40i19Q2AcXABYNoL-10.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/40i19Q2AcXABYNoL-10.png)

<p class="callout info">Le paramètre $(pwd) est le chemin courant (là où on se trouve dans la machine hôte)</p>

On retrouve bien le fichier fic

[![11.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/FSNXIMKOHBxEC6Do-11.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/FSNXIMKOHBxEC6Do-11.png)

On peut également, à travers du conteneur, écrire dans ce fichier et vérifier dans la machine hôte si on a pu écrire dedans

```
echo TEST >> /texte/fic
```

<p class="callout info">Le paramètre &gt;&gt; permet d'incrémenter le texte du fichier</p>

[![12.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/FfsWPRfH8NNnpM9J-12.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/FfsWPRfH8NNnpM9J-12.png)

Il est également possible de donner accès à ce fichier en lecture seule de la manière suivante. En rajoutant une ligne nous aurons un message d'erreur disant que le fichier est en lecture seule (ro = read only) :

[![13.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/jfqzswy6gIohyhv3-13.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/jfqzswy6gIohyhv3-13.png)

On peut également créer un script et voir s'il est compatible dans la version de bash que nous avons

Créons le script :

```
vi script.sh
```

> echo OK &amp;&gt;&gt; /tmp/test  
> cat /tmp/test

Le rendre executable

```
sudo chmod +x script.sh
```

Maintenant lançon-le dans docker

```
sudo docker run --rm -v $(pwd)/script.sh:/script.sh bash /script.sh
```

[![14.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/F24Dt6Hj4YViocyy-14.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/F24Dt6Hj4YViocyy-14.png)

<p class="callout warning">Attention de ne pas monter de dossier sensibles de la machine hôte sur le conteneur !</p>

# Labo 5 - Le réseau, partie 1

Pour voir comment se comporte le réseau entre les conteneurs, la machine hôte et le réseau local, nous allons créer un conteneur avec le serveur web nginx

```
sudo docker run --rm nginx
```

[![15.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/sTLpCt2nLOaqPWJM-15.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/sTLpCt2nLOaqPWJM-15.png)

On voit que le conteneur est créé et en cours d'exécution. Le port 80 est ouvert mais uniquement sur le conteneur. Il va falloir faire un mappage de port pour accéder au serveur nginx du conteneur à travers le navigateur web

Pour ce faire il faut utiliser la commande précédente et rajouter l'option -p avec le port de l'hôte 80 et celui du conteneur 80

```
sudo docker run --rm -p 80:80 nginx
```

[![16.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/x5FIgoZ29K81KRtu-16.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/x5FIgoZ29K81KRtu-16.png)

Si nous ouvrons un navigateur avec l'adresse ip du conteneur, nous arrivons sur nginx

[![17.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/ms9IZdlV4WhAdH3k-17.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/ms9IZdlV4WhAdH3k-17.png)

<p class="callout warning">Attention, il n'est pas possible d'ouvrir le même port hôte pour un autre conteneur</p>

Il est également possible de laisser l'hôte choisir son port

```
sudo docker run --rm 80 nginx
```

Puis sur un autre terminal de la machine hôte :

```
sudo netstat -nate
```

[![18.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/ZCMkBfBYYLqpMNY6-18.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/ZCMkBfBYYLqpMNY6-18.png)

On voit que le port 32768 est apparu. Nginx sera donc accessible sur votre navigateur via [http://votreadresseip:32768](http://votreadresseip:32768)

Nous pouvons également trouver le port aléatoire créé par l'hôte avec la commande suivante depuis la machine hôte

```
sudo docker inspect lenomdevotreconteneur
```

[![19.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/zycmp47KB0WFv5ev-19.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/zycmp47KB0WFv5ev-19.png)

Nous pouvons voir également quels sont les ports exposés par une image d'un conteneur :

```
sudo docker inspect nginx
```

[![20.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/oT1vTI0pBDvylLlH-20.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/oT1vTI0pBDvylLlH-20.png)

# Labo 6 - Détacher, attacher un conteneur

Pour lancer un conteneur en tâche de fond, il faut se détacher de ce dernier avec l'option -d, par exemple pour nginx :

```
sudo docker run -d -p 80:80 nginx
```

[![21.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/fxGQErtQGBUMbhER-21.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/fxGQErtQGBUMbhER-21.png)

Mais comment arrêter un conteneur ?   
On peut se rattacher au conteneur pour pouvoir l'arrêter avec un ctrl+c

```
sudo docker attach <idduconteneur ou nomduconteneur>
```

[![22.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/d9wsElDBuDCNuNLX-22.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/d9wsElDBuDCNuNLX-22.png)

Pour pouvoir se rattacher et se détacher au conteneur sans l'arrêter, il faut lancer la première commande avec l'option -ti

Puis on peut s'y attacher avec la commande précédente

Et s'en détacher sans l'arrêter avec ctrl+p et ctrl+q

[![23.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/DAwWZAP9icNC3mvJ-23.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/DAwWZAP9icNC3mvJ-23.png)

Nous pouvons également arrêter un conteneur

```
sudo docker stop <idduconteneur ou nomduconteneur>
```

Pour voir les logs d'un conteneur en cours d'exécution

```
sudo docker logs <idduconteneur ou nomduconteneur>
```

[![24.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/I8ulUcMdSJByoBah-24.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/I8ulUcMdSJByoBah-24.png)

Et pour voir les logs qui apparaissent au fur et à mesure, il faut rajouter l'option -f à la commande précédente

```
sudo docker logs -f <idduconteneur ou nomduconteneur>
```

# Labo 7 - Création d'images

Nous allons voir dans cette exemple comment customiser une image officielle php.   
D'abord créons le conteneur et on se retrouve dans la console php du conteneur

```
sudo docker run -ti php
```

[![25.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/NB8L3swB8feDk18O-25.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/NB8L3swB8feDk18O-25.png)

Nous allons utiliser Soap (qui permet de créer des web services)

```
new SoapClient();
```

[![26.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/AtUxLYcdzC8ccp5M-26.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/AtUxLYcdzC8ccp5M-26.png)

Nous voyons que le module Soap n'est pas présent sur l'image officielle de php téléchargée précédemment  
Pour l'installer, il faut d'abord se connecter au conteneur php en bash depuis un terminal de la machine hôte

```
sudo docker exec -ti <idduconteneur> bash
```

[![27.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/Pn8Ib2U5U240Qbir-27.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/Pn8Ib2U5U240Qbir-27.png)

Pour trouver comment installer l'extension souhaitée, il faut aller sur le [hub de docker](https://hub.docker.com/search?q=&type=image) dans explore, puis php

[![28.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/FwnUd3pp5AcAsFDj-28.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/FwnUd3pp5AcAsFDj-28.png)

Donc dans le terminal bash du conteneur

```
docker-php-ext-install soap
```

[![29.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/hxrJscpVGFPR4CUn-29.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/hxrJscpVGFPR4CUn-29.png)

Visiblement il manque une librairie : libxml-2.0  
Pour là trouver de retour dans le terminal bash du conteneur :

```
apt update && apt-cache search libxml2
```

[![30.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/0Kuy63xJW0NyF2F8-30.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/0Kuy63xJW0NyF2F8-30.png)

Puis faire

```
apt install -y libxml2-dev
```

[![31.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/PeSuHvk3GhSYhvp5-31.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/PeSuHvk3GhSYhvp5-31.png)

Et maintenant relançons l'installation de soap

```
docker-php-ext-install soap
```

[![32.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/EThJJ7VL4VmqWmhY-32.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/EThJJ7VL4VmqWmhY-32.png)

Si nous relançons la commande new SoapClient depuis le terminal php cela ne fonctionnera pas puisque php est déjà lancé et il n'a pas l'extension précédemment installée.

Depuis le terminal bash, lançons d'abord php -a (pour se remettre en mode php, puis

```
new SoapClient('http://webservices.oorsprong.org/webexamples.countryinfo/CountryInfoService.wso?WSDL');
```

[![33.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/wTwffVneNrzot3zk-33.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/wTwffVneNrzot3zk-33.png)

Le webservice a été déplacé... mais cela n'empêche en rien la création de l'image.

La création de l'image passe par un Dockerfile

De retour dans le terminal hôte nous allons éditer un Dockerfile

```
sudo vi Dockerfile
```

Puis copier coller le texte dedans en sauvegardant

`FROM php:7.0.31-cli`  
`RUN apt update`  
`RUN apt install -y libxml2-dev`  
`RUN docker-php-ext-install soap`

Pour construire l'image, il faut

```
sudo docker build -t php_soap:7.0.31 .
```

build -&gt; construction de l'image à l'aide du Dockerfile  
-t -&gt; permet de donner un tag à notre image  
. -&gt; chemin courant où se trouve le Dockerfile (pour un Dockerfile avec un nom personnalisé, il faut rajouter -f MonDockerFile .)

J'ai choisi de personnaliser le nom de mon Dockerfile donc je lance la commande

```
sudo docker build -t php_soap:7.0.31 -f MonDockerFile .
```

[![34.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/QlX48pJzn0V2CjNo-34.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/QlX48pJzn0V2CjNo-34.png)

On vérifie que l'image soit bien dans le cache :

```
sudo docker images
```

[![35.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/a6Mv85hRpXGTGwz3-35.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/a6Mv85hRpXGTGwz3-35.png)

Testons notre image pour voir si le module soap a bien été installé :

```
sudo docker run -ti php_soap:7.0.31
```

[![36.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/SQHXoRtlaQLPU23X-36.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/SQHXoRtlaQLPU23X-36.png)

L'image customisée avec soap est bien présente !

Maintenant il est également possible de faire évoluer la version de notre image par exemple en 7.2.8

Modifions notre fichier customisé MonDockerFile

```
sudo vi MonDockerFile
```

[![37.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/vR4xfzADWU2w0iOL-37.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/vR4xfzADWU2w0iOL-37.png)

```
sudo docker build -t php_soap:7.2.8 -f MonDockerFile .
```

[![38.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/02XzTppVszD2bzVB-38.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/02XzTppVszD2bzVB-38.png)

Même chose que plus haut, vérifions

```
sudo docker run -ti php_soap:7.2.8
```

[![39.png](https://kb.numericare.fr/uploads/images/gallery/2021-01/scaled-1680-/gsfr7Tr5D8jUYn8J-39.png)](https://kb.numericare.fr/uploads/images/gallery/2021-01/gsfr7Tr5D8jUYn8J-39.png)

<p class="callout success">Cela a fonctionné. Il ne nous reste plus qu'à arrêter l'ancien conteneur et mettre en marche le nouveau</p>

# Labo 8 - Le réseau, partie 2

Il existe 5 types de drivers réseaux que nous pouvons utiliser lors de la création d'un conteneur en ajoutant cet argument

```
--network <type>
```

##### Driver 1 : none

Absence totale de réseau au conteneur

```
sudo docker run -ti --rm --network none bash
```

[![image-1605530172447.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/7r1bhe9HjILnKQTf-image-1605530172447.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/7r1bhe9HjILnKQTf-image-1605530172447.png)

Même en spécifiant un port avec -p il n'y aura pas de communication réseau

##### Driver 2 : bridge

Iil est le pilote par défaut. Il peut être utilisé pour faire communiquer plusieurs conteneurs entre eux quand c'est spécifié

Nous avons des adresses ip et nous voyons que les conteneurs se voient

[![image-1605530674999.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/tLR39IdZaXafri7O-image-1605530674999.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/tLR39IdZaXafri7O-image-1605530674999.png)

Les deux conteneurs peuvent également communiquer avec le réseau de l'hôte qui a par défaut l'adresse ip 172.17.0.1

[![image-1605530791449.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/kDChOEOcWrSNxXIA-image-1605530791449.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/kDChOEOcWrSNxXIA-image-1605530791449.png)

Maintenant chaque conteneur créé pourra communiquer avec un autre grâce au bridge par défaut.   
Il est cependant possible d'isoler les réseaux des conteneurs en créant un clone du bridge

```
sudo docker network create --driver=bidge mon_bridge
```

Puis un

```
sudo docker network ls
```

[![image-1605531194118.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/2h1kNvakCOuebauw-image-1605531194118.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/2h1kNvakCOuebauw-image-1605531194118.png)

Voyons comment créer des conteneurs sur ce nouveau bridge

```
sudo docker run -ti --rm --network=mon_bridge --name=srv1 bash
```

Puis

```
ifconfig
```

Et pour le deuxième conteneur

```
sudo docker run -ti --rm --network=mon_bridge --name=srv2 bash
```

Puis

```
ifconfig
```

[![image-1605531621956.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/ioX5SQshO7mznaIx-image-1605531621956.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/ioX5SQshO7mznaIx-image-1605531621956.png)

Le DNS interne géré par Docker ne s'applique uniquement qu'aux réseaux bridges clonés

[![image-1605531787033.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/ImHEqDWlEXiOwUHX-image-1605531787033.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/ImHEqDWlEXiOwUHX-image-1605531787033.png)

Maintenant si les conteneurs sont rattachés au bridge par défaut, il est possible de les rattacher dynamiquement à un bridge cloné

```
sudo docker network connect=mon_bridge srv1
```

et

```
sudo docker network connect=mon_bridge srv2
```

Pour supprimer un bridge cloné, il suffit de faire

```
sudo docker network rm mon_bridge
```

[![image-1605532605274.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/lD9WH5js7RPuZoDh-image-1605532605274.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/lD9WH5js7RPuZoDh-image-1605532605274.png)

<p class="callout info">Cette opération ne peut se faire si nous n'avons plus aucun conteneur attaché à ce réseau</p>

##### Driver 3 : host

Il permet à un conteneur de partager la même pile réseau que celle de l'hôte

Par exemple avec nginx nous avions spécifié un port particulier mais si nous faisons simplement

```
sudo docker run --rm --network=host nginx
```

On a bien accès au serveur nginx via un navigateur web  
L'accès au network host est assez peu courant

##### Driver 4 : overlay

Il permet de connecter entre eux qui tournent sous des hôtes différents

##### Driver 5 : Macvlan

Il permet d'attribuer une adresse MAC à l'interface réseau virtuelle de chaque conteneur

# Labo 9 - Les volumes, partie 2

Nous allons continuer à voir le mappage des volumes de l'hôte vers le conteneur

Créons un dossier avec un fichier auquel je lui donne tous les droits et du texte dedans

```
sudo mkdir test && sudo chmod -R 777 test && sudo echo OK > test/fic && sudo cat test/fic
```

[![48.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/dPIxv29SB8sw27sG-48.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/dPIxv29SB8sw27sG-48.png)

Créons un conteneur en mappant ce dossier :

```
sudo docker run --rm -ti -v $(pwd)/test:/test bash
```

[![49.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/zliVM0vI2SinbV8x-49.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/zliVM0vI2SinbV8x-49.png)

Voyons le contenu de notre fichier /sbin (répertoire qui contient des commandes de base pour l'administration du système)

```
ls -lh /sbin
```

[![50.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/DiicSGrY6yrjaFXq-50.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/DiicSGrY6yrjaFXq-50.png)

Sortons du conteneur et créons-en un nouveau en changeant le mappage du volume de cette manière :

```
sudo docker run --rm -ti -v $(pwd)/test:/sbin bash
```

[![51.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/5OiKndAhb84SfEjs-51.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/5OiKndAhb84SfEjs-51.png)

Le mappage a totalement éclipsé le contenu de sbin, c'est la particularité du mappage.

##### Les volumes managés

Nous allons voir un autre type de volumes : les volumes managés. C'est docker qui a la main dessus alors que les volumes mappés sont sur l'hôte lui même.

Pour ce faire, créons un volume

```
sudo docker volume create mes_donnees && sudo docker volume ls
```

[![52.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/p1eCnTi7zCxmaAW9-52.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/p1eCnTi7zCxmaAW9-52.png)

Essayons de créer un nouveau conteneur avec le volume managé créé ci-dessus

```
sudo docker run --rm -ti -v mes_donnees:/test bash
```

[![53.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/TmhyROol46Lsbet1-53.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/TmhyROol46Lsbet1-53.png)

On voit bien qu'en créant un fichier dans le conteneur, en sortant du conteneur (= conteneur détruit) et en recréant un nouveau conteneur, le fichier est toujours présent grâce au volume managé

<p class="callout info">En lançant la commande précédente, il est possible de créer directement le volume managé sans passer par la commande   
sudo docker volume create mes\_donnees</p>

Voici comment retrouver les volumes managés par docker

```
sudo docker volume inspect mes_donnees
```

[![54.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/cUpkQROqz48a4Ak7-54.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/cUpkQROqz48a4Ak7-54.png)

Allons voir dedans pour voir si le fichier fic est bien présent

```
sudo ls -lh /var/lib/docker/volumes/mes_donnees/_data
```

[![55.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/DdhklpGDpaQ6YgOI-55.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/DdhklpGDpaQ6YgOI-55.png)

Si on monte sur le volume managé le dossier sbin

```
sudo docker run --rm -ti -v mes_donnees:/sbin bash
```

[![56.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/kBxy9SQqjlxIBZK4-56.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/kBxy9SQqjlxIBZK4-56.png)

On voit bien le fichier fic présent dans le volume managé sur l'hôte.   
Supprimons, depuis l'hôte ce fichier dans le volume managé et relançons le création d'un nouveau conteneur

[![57.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/s0lhZtpTHOJ7UuR0-57.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/s0lhZtpTHOJ7UuR0-57.png)

Le volume managé étant vide, on peut voir maintenant le contenu du dossier /sbin dans le conteneur.   
On sort du conteneur, et affichons le contenu du volume partagé

```
sudo ls -lh /var/lib/docker/volumes/mes_donnees/_data/
```

[![58.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/sVYeXZHEtykh23KP-58.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/sVYeXZHEtykh23KP-58.png)

On retrouve l'intégralité du dossier /sbin du conteneur bien que ce dernier ait été supprimé  
Je peux donc créer, modifier, supprimer des dossiers ou fichiers depuis l'hôte ou depuis le conteneur.

<p class="callout info">Quand on monte un volume managé <span style="text-decoration:underline;">**VIDE**</span>, le contenu du dossier de montage du conteneur est intégralement transféré dans le volume managé. Tout cela est persistent à la suppression du conteneur</p>

# Labo 10 - Docker compose

Docker compose est un chef de cuisine qui permet de créer une recette en y mettant dedans tous le conteneurs nécessaires à la fabrication du plat final

Nous allons monter un serveur Wordpress (serveur Web + base de données)

Tout d'abord il faut créer le fichier docker-compose.yml

Pour plus d'infos sur le format .yaml, il suffit d'aller sur le sur leur site [https://yaml.org/](https://yaml.org/)

La première ligne correspond à la dernière version de docker compose qui est rétro-compatible avec les anciennes versions

```
sudo vi docker-compose.yml
```

On peut retrouver plusieurs sections dans ce fichier :

version: "3.8" -&gt; obligatoire (version actuelle de docker-compose)  
services: -&gt; obligatoire (les conteneurs dont nous aurons besoin)  
volumes: -&gt; dépend de vos besoins  
networks: -&gt; dépend de vos besoins

Voici donc le texte à copier-coller dans votre fichier docker-compose.yml

<p class="callout warning">Attention : pensez à respecter les indentations !!!!</p>

```YAML
version: "3.8"
services: #nom du conteneur
  wordpress:
    image: wordpress:4.9 #image à téléchager sur le docker hub avec le tag
    ports:
      - 80:80 #ports à ouvrir entre l'hôte et le conteneur
    environment: #variables d'environnements nécessaires pour la création du conteneur prises sur le docker hub www.hub.docker.com
      - WORDPRESS_DB_HOST=db #nom du conteneur de la base de données
      - WORDPRESS_DB_USER=tata #utilisateur qui aura été créé plus bas
      - WORDPRESS_DB_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
      - WORDPRESS_DB_NAME=wordp #nom de la basse de données
    networks:
      - galaxie #nom du réseau auquel sera connecté le conteneur
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=tata_yoyo #mot de passe root de la base de données
      - MYSQL_DATABASE=wordp #nom de la base de données
      - MYSQL_USER=tata #utilisateur de la base de données
      - MYSQL_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
    networks:
      - galaxie
#volumes: #à ce stade la section volume sera utilisée plus tard
networks:
  galaxie: #création réseau bridgé cloné
```

[![image-1605617617291.png](https://kb.numericare.fr/uploads/images/gallery/2020-11/scaled-1680-/1gj0NFwYfiKECiwp-image-1605617617291.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/1gj0NFwYfiKECiwp-image-1605617617291.png)

Pour lancer la création de mon environnement

```
docker-compose up
```

[![60.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/lxWosxM2KMMuLQhG-60.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/lxWosxM2KMMuLQhG-60.png)

S'il n'y a pas d'erreur, rendez-vous sur votre navigateur web en tapant l'ip de votre host

[![61.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/8bSkcjuvxRmifpTA-61.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/8bSkcjuvxRmifpTA-61.png)

En suivant les étapes d'installation, on a bien un wordpress fonctionnel

[![62.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/yyeJzIR0yjT1gtE0-62.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/yyeJzIR0yjT1gtE0-62.png)

Si nous quittons l'environnement, les conteneurs vont s'arrêter. Pour que les conteneurs soit lancés en tâche de fond

```
docker-compose up -d
```

[![63.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/iLtrhaOItNa5wBvQ-63.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/iLtrhaOItNa5wBvQ-63.png)

Pour arrêter les conteneurs sans les supprimer

```
docker-compose stop
```

Pour les démarrer

```
docker compose start
```

Pour supprimer tout un environnement

```
docker-compose down
```

[![64.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/T2q6rIfBOzUAycJN-64.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/T2q6rIfBOzUAycJN-64.png)

<p class="callout warning">Cette commande supprime tout sauf les volumes</p>

Voyons justement comment personnaliser wordpress avec les volumes  
Le chemin de base de wordpress se trouve dans /var/www/html  
Et celui de mysql dans /var/lib/mysql

Nous allons commencer par la création de volumes mappés

Editons le fichier docker-compose.yml

```
sudo vi docker-compose.yml
```

```YAML
version: "3.8"
services: #nom du conteneur
  wordpress:
    image: wordpress:4.9 #image à téléchager sur le docker hub avec le tag
    ports:
      - 80:80 #ports à ouvrir entre l'hôte et le conteneur
    environment: #variables d'environnements nécessaires pour la création du conteneur prises sur le docker hub www.hub.docker.com
      - WORDPRESS_DB_HOST=db #nom du conteneur de la base de données
      - WORDPRESS_DB_USER=tata #utilisateur qui aura été créé plus bas
      - WORDPRESS_DB_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
      - WORDPRESS_DB_NAME=wordp #nom de la basse de données
    networks:
      - galaxie #nom du réseau auquel sera connecté le conteneur
    volumes:
      - ./data/wp:/var/www/html #volume pour préserver les données de wordpress 
 db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=tata_yoyo #mot de passe root de la base de données
      - MYSQL_DATABASE=wordp #nom de la base de données
      - MYSQL_USER=tata #utilisateur de la base de données
      - MYSQL_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
    networks:
      - galaxie
    volumes: 
      - ./data/db:/var/lib/mysql
#volumes: #à ce stade la section volume sera utilisée plus tard
networks:
  galaxie: #création réseau bridgé cloné
```

[![image-1605621642580.png](https://192.168.1.221/uploads/images/gallery/2020-11/scaled-1680-/p87xUEUVWeYwXC6a-image-1605621642580.png)](https://kb.numericare.fr/uploads/images/gallery/2020-11/p87xUEUVWeYwXC6a-image-1605621642580.png)[![65.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/1JibTFtOwfyPhSMZ-65.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/1JibTFtOwfyPhSMZ-65.png)

Tapez la commande pour recréer l'environnement et la nouvelle installation de wordpress

```
docker-compose up -d
```

Donc en tapant la commande docker-compose down, les conteneurs seront arrêtés et supprimés mais les données conservées dans le volume spécifié (ici le /data)

Voyons maintenant le comportement avec les volumes managés

Editons de nouveau le fichier docker-compose.yml

```YAML
version: "3.8"
services: #nom du conteneur
  wordpress:
    image: wordpress:4.9 #image à téléchager sur le docker hub avec le tag
    ports:
      - 80:80 #ports à ouvrir entre l'hôte et le conteneur
    environment: #variables d'environnements nécessaires pour la création du conteneur prises sur le docker hub www.hub.docker.com
      - WORDPRESS_DB_HOST=db #nom du conteneur de la base de données
      - WORDPRESS_DB_USER=tata #utilisateur qui aura été créé plus bas
      - WORDPRESS_DB_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
      - WORDPRESS_DB_NAME=wordp #nom de la basse de données
    networks:
      - galaxie #nom du réseau auquel sera connecté le conteneur
    volumes:
      - wp:/var/www/html #volume pour préserver les données de wordpress 
 db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=tata_yoyo #mot de passe root de la base de données
      - MYSQL_DATABASE=wordp #nom de la base de données
      - MYSQL_USER=tata #utilisateur de la base de données
      - MYSQL_PASSWORD=yoyo #mot de passe de l'utilisateur de la base de données
    networks:
      - galaxie
    volumes: 
      - db:/var/lib/mysql
volumes: #ici ce sont des volumes managés que vous modifierez plus haut
  wp:
  db:
networks:
  galaxie: #création réseau bridgé cloné
```

[![66.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/6QrrGdInigjnyQJ3-66.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/6QrrGdInigjnyQJ3-66.png)

Et nous relançons la commande suivant pour recréer les conteneurs avec les volumes managés

```
docker-compose up
```

[![67.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/306zCpFBT2XJUFag-67.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/306zCpFBT2XJUFag-67.png)

Pas de surprise tout fonctionne et on repart sur une nouvelle installation de wordpress  
Arrêtons le tout et voyons si les volumes ont bien été créés

```
sudo docker volume ls
```

[![68.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/zEuXoeU4kgGyrZe5-68.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/zEuXoeU4kgGyrZe5-68.png)

En faisant un docker-compose down, les conteneurs seront supprimés mais pas les volumes

[![69.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/ivJdO75WgroyOUDI-69.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/ivJdO75WgroyOUDI-69.png)

Cependant il est possible de forcer la suppression de ces volumes

```
docker-compose down -v
```

[![70.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/qHxr8DNdrdNBSjOQ-70.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/qHxr8DNdrdNBSjOQ-70.png)

<p class="callout info">Cela supprime les volumes managés créés à partir du docker-compose.yml mais pas les autres volumes managés créés avec docker</p>

Pour finir, il est possible de modifier un paramètre dans le fichier docker-compose.yml en cas d'arrêt ou redémarrage de docker.

Il s'agit de restart:

restart: always #permet de redémarrer automatiquement le conteneur quel que soit l'état dans lequel il était avant l'arrêt ou le redémarrage de docker  
restart: no #empêche de redémarrer automatiquement le conteneur quel que soit l'état dans lequel il était avant l'arrêt ou le redémarrage de docker  
restart: unless-stopped #permet de redémarrer automatiquement le conteneur s'il était démarré avant l'arrêt ou le redémarrage de docker

# Labo 11 - Portainer

Portainer est un outil graphique permettant de piloter les conteneurs d'un ou plusieurs hôtes

Installons-le

```
sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce
```

[![71.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/zbhdTl0gCF94FtHA-71.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/zbhdTl0gCF94FtHA-71.png)

Rendez-vous maintenant sur un navigateur avec l'url de votre serveur en précisant le port 9000

Paramétrez un mot de passe de première connexion

[![72.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/GxautgBmI6xAOD3L-72.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/GxautgBmI6xAOD3L-72.png)

Nous pouvons gérer des conteneurs distants mais là nous allons le faire sur notre machine locale

[![73.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/9djJBbimSKrmiGIp-73.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/9djJBbimSKrmiGIp-73.png)

En cliquant sur le bandeau local on peut retrouver nos images, nos volumes, ...

[![74.png](https://kb.numericare.fr/uploads/images/gallery/2021-03/scaled-1680-/DUNse8T6TNYbFPMv-74.png)](https://kb.numericare.fr/uploads/images/gallery/2021-03/DUNse8T6TNYbFPMv-74.png)

Je ne vais pas détailler toutes les vues de cette interface graphique mais vous pourrez chercher et fouiller !

# Labo 12 - Docker Registry Local - Commit

Nous allons voir comment créer un registre local d'images Docker afin de pouvoir les télécharger plus rapidement, créer des images modifiées ou simplement sauvegardé les images existantes

Considérons que votre machine hébergeant le registre local est un machine sous Linux et que docker et docker-compose sont installés.

<p class="callout info">Nous installerons une version dite insecure qui n'est pas viable en production</p>

Vous pourrez retrouver la documentation complète [ici](https://docs.docker.com/registry/)

Tout d'abord, il faut éditer ou créer le fichier docker-compose.yml

```shell
sudo vim /opt/docker/docker-compose.yml
```

```YAML
version: "3.8"
services:
  registry:
    container_name: registry
    restart: always
    image: registry:latest
    ports:
      - 5000:5000
    volumes:
      - /opt/docker/registry/data:/var/lib/registry
      - /opt/docker/registry/certs:/certs
      - /opt/docker/registry/auth:/auth
```

Ensuite, il faudra éditer ou créer un fichier sur la machine qui hébergera le registre local ainsi que sur celle qui voudra récupérer l'image

```shell
sudo vim /etc/docker/daemon.json
```

```JSON
{
  "insecure-registries" : ["myregistry.local:5000"]
}
```

Ensuite il faudra modifier le fichier hostname et le fichier hosts de notre machine. A noter qu'il faudra bien déclarer la machine hébergeant le registre local dans le fichier hosts des autres machines voulant récupérer les images

Pour le fichier hostname

```shell
sudo nano /etc/hostname
```

```shell
myregistry.local
```

Et pour le fichier hosts

```shell
sudo vim /etc/hosts
```

```shell
127.0.0.1	localhost
192.168.1.226   localhost
127.0.0.1	myregistry.local
192.168.1.226   myregistry.local
```

Ensuite on redémarre les démons et le service docker

```
sudo systemctl daemon-reload
sudo systemctl restart docker
```

Maintenant on peut lancer le conteneur

```shell
sudo docker-compose up -d
```

Le conteneur tourne et est opérationnel

docker push bash

docker tag

```shell
sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload
```