# 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