• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 12/12/2019

Créez un fichier docker-compose pour orchestrer vos conteneurs

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Créez votre fichier docker-compose.yml

Nous avons vu dans le chapitre précédent comment utiliser l'interface en ligne de commande de Docker Compose ; vous allez maintenant apprendre à créer un fichier docker-compose.yml.

Structure de notre Docker Compose
Structure de notre Docker Compose

Vous devez commencer par créer un fichier docker-compose.yml à la racine de votre projet. Dans celui-ci, nous allons décrire l'ensemble des ressources et services nécessaires à la réalisation de votre POC.

Décrivez votre premier service : db

Définissez la version de Docker Compose

Un fichier docker-compose.yml commence toujours par les informations suivantes :

version: '3'

L'argument version permet de spécifier à Docker Compose quelle version on souhaite utiliser, et donc d'utiliser ou pas certaine version. Dans notre cas, nous utiliserons la version 3, qui est actuellement la version la plus utilisée.

Déclarez le premier service et son image

Nous allons maintenant déclarer notre premier service, et donc créer notre stack Wordpress !

services:
db:
image: mysql:5.7

Puis, vous devez décrire votre conteneur ; dans notre cas, nous utilisons l’argument image qui nous permet de définir l'image Docker que nous souhaitons utiliser.

Définissez le volume pour faire persister vos données

services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql

Pour rappel, nous avons vu précédemment que les conteneurs Docker ne sont pas faits pour faire fonctionner des services stateful, et une base de données est par définition un service stateful. Cependant, vous pouvez utiliser l'argument volumes qui vous permet de stocker l'ensemble du contenu du dossier /var/lib/mysql dans un disque persistant. Et donc, de pouvoir garder les données en local sur notre host.

Cette description est présente grâce à la ligne db_data:/var/lib/mysqldb_data est un volume créé par Docker directement, qui permet d'écrire les données sur le disque hôte sans spécifier l'emplacement exact. Vous auriez pu aussi faire un /data/mysql:/var/lib/mysql qui serait aussi fonctionnel.

Définissez la politique de redémarrage du conteneur

services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always

Les conteneurs étant par définition monoprocessus, si celui-ci rencontre une erreur fatale, il peut être amené à s'arrêter. Dans notre cas, si le serveur MySQL s'arrête, celui-ci redémarrera automatiquement grâce à l'argument restart: always.

Définissez les variables d'environnement

services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

L'image MySQL fournie dispose de plusieurs variables d'environnement que vous pouvez utiliser ; dans votre cas, nous allons donner au conteneur les valeurs des différents mots de passe et utilisateurs qui doivent exister sur cette base. Quand vous souhaitez donner des variables d'environnement à un conteneur, vous devez utiliser l'argument environment, comme nous avons utilisé dans le fichier docker-compose.yml ci-dessus.

Décrivez votre second service : Wordpress

Dans le second service, nous créons un conteneur qui contiendra le nécessaire pour faire fonctionner votre site avec Wordpress. Cela nous permet d'introduire deux arguments supplémentaires.

services:
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress

Le premier argument, depends_on, nous permet de créer une dépendance entre deux conteneurs. Ainsi, Docker démarrera le service db avant de démarrer le service Wordpress. Ce qui est un comportement souhaitable, car Wordpress dépend de la base de données pour fonctionner correctement.

Le second argument, ports, permet de dire à Docker Compose qu'on veut exposer un port de notre machine hôte vers notre conteneur, et ainsi le rendre accessible depuis l'extérieur.

Voici le fichier docker-compose.yml dans sa version finale :

version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}

Lancez votre stack Docker Compose

Quand vous lancerez vos conteneurs avec la commande docker-compose up -d, vous devriez avoir le résultat suivant :

$ docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
efd26ecc9548: Pull complete
a3ed95caeb02: Pull complete
...
Digest: sha256:34a0aca88e85f2efa5edff1cea77cf5d3147ad93545dbec99cfe705b03c520de
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
efd26ecc9548: Already exists
a3ed95caeb02: Pull complete
589a9d9a7c64: Pull complete
...
Digest: sha256:ed28506ae44d5def89075fd5c01456610cd6c64006addfe5210b8c675881aff6
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1
Creating my_wordpress_wordpress_1

Lors de l'exécution de cette commande, Docker Compose commence par vérifier si nous disposons bien en local des images nécessaires au lancement des stacks. Dans le cas contraire, il les télécharge depuis une registry, ou les build via un docker build.

Puis celui-ci lance les deux conteneurs sur votre système ; dans notre cas, vous pourrez voir le résultat en vous ouvrant l'URL suivante dans votre navigateur :  http://127.0.0.1:8000.

Page d'accueil de configuration d'un site Wordpress
Votre site Wordpress fonctionnel !

Résumé

Vous savez maintenant utiliser les commandes de base de Docker Compose, et créer un fichier docker-compose.yml pour orchestrer vos conteneurs Docker.

Pour rappel, voici les arguments que nous avons pu voir dans ce chapitre :

  • image qui permet de spécifier l'image source pour le conteneur ;

  • build qui permet de spécifier le Dockerfile source pour créer l'image du conteneur ;

  • volume qui permet de spécifier les points de montage entre le système hôte et les conteneurs ;

  • restart qui permet de définir le comportement du conteneur en cas d'arrêt du processus ;

  • environment qui permet de définir les variables d’environnement ;

  • depends_on qui permet de dire que le conteneur dépend d'un autre conteneur ;

  • ports qui permet de définir les ports disponibles entre la machine host et le conteneur.

Exemple de certificat de réussite
Exemple de certificat de réussite