Docker par la pratique (13) – Compose

Voici le treizième volet de la formation Docker. Dans mon précédent article, nous avons approfondi la combinaison de plusieurs conteneurs à l’aide d’un réseau Docker. La mise en place d’une telle configuration avec docker run simplifie déjà pas mal les choses pour installer une application complexe comme WordPress, mais il existe un outil bien plus confortable pour ce genre de tâche, et c’est ce qui fait l’objet de cet atelier pratique.

La commande docker compose évalue le contenu d’un fichier compose.yaml dans le répertoire courant et configure les conteneurs correspondants. Cette manière de faire est extrêmement pratique lorsqu’il s’agit de combiner plusieurs conteneurs. Pour utiliser docker compose, il suffit de se familiariser avec la syntaxe du fichier compose.yaml.

Dans le passé, docker-compose (avec le trait d’union) était une commande distincte indépendante de docker. Les versions actuelles de Docker ont intégré compose (sans le trait d’union) comme une commande officielle de docker.

YAML

Si vous travaillez avec docker compose, vous devez d’abord créer un fichier compose.yaml. L’extension .yaml désigne ici le format YAML (YAML Ain’t Markup Language). Le web regorge de tutos d’introduction à YAML. La page anglophone de Wikipedia fournit une vue d’ensemble synthétique sur la syntaxe de YAML avec une poignée d’exemples parlants :

https://en.wikipedia.org/wiki/YAML

N’hésitez pas à utiliser un validateur de syntaxe pour éviter les erreurs bizarres. Pour ma part, j’aime bien l’outil yamllint.

Hello Compose !

Pour vous faire une petite démonstration pratique de la syntaxe de compose.yaml, j’ai adapté la configuration du précédent article avec un serveur de bases de données MariaDB, une interface d’administration PHPMyAdmin et le moteur de blog WordPress.

Pour commencer, je crée un répertoire de travail :

$ mkdir -v wordpress-compose
mkdir: création du répertoire ‘wordpress-compose’
$ cd wordpress-compose/

J’ouvre mon éditeur de texte préféré et je crée le fichier compose.yaml suivant :

# compose.yaml
services:
# MariaDB
mariadb:
image: mariadb:latest
volumes:
– blog-db-volume:/var/lib/mysql
environment:
MYSQL_RANDOM_ROOT_PASSWORD: 1
MYSQL_DATABASE: wp
MYSQL_USER: wpuser
MYSQL_PASSWORD: motdepasse
restart: always
# PHPMyAdmin
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
PMA_HOST: mariadb
ports:
– « 8080:80 »
restart: always
# WordPress
wordpress:
image: wordpress:latest
volumes:
– blog-wp-volume:/var/www/html/wp-content
ports:
– « 80:80 »
environment:
WORDPRESS_DB_HOST: mariadb
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_NAME: wp
WORDPRESS_DB_PASSWORD: motdepasse
restart: always
volumes:
blog-db-volume:
blog-wp-volume:

Utilisez deux espaces pour chaque indentation. Évitez les tabulations.

Je vérifie la syntaxe de mon fichier :

$ yamllint compose.yaml

Je démarre mon réseau de conteneurs :

$ docker compose up -d
[+] Running 6/6
✔ Network wordpress-compose_default Created 0.2s
✔ Volume « wordpress-compose_blog-db-volume » Created 0.0s
✔ Volume « wordpress-compose_blog-wp-volume » Created 0.0s
✔ Container wordpress-compose-mariadb-1 Started 0.0s
✔ Container wordpress-compose-phpmyadmin-1 Started 0.0s
✔ Container wordpress-compose-wordpress-1 Started 0.0s

En moins d’une seconde, ma configuration est prête à l’emploi. PHPMyAdmin est joignable à l’adresse http://localhost:8080 :

WordPress s’affiche à l’adresse http://localhost :

J’établis un premier état des lieux, et je me rends compte que le nom de mon répertoire de travail wordpress-compose est utilisé pour nommer les conteneurs, les volumes et le réseau :

docker ps recense trois conteneurs actifs :

wordpress-compose-mariadb-1
wordpress-compose-phpmyadmin-1
wordpress-compose-wordpress-1

docker network ls affiche un nouveau réseau Docker :

wordpress-compose_default

docker volume ls montre la présence de deux nouveaux volumes :

wordpress-compose_blog-db-volume
wordpress-compose_blog-wp-volume

Pour arrêter et supprimer tous les conteneurs de la configuration, j’utilise la commande suivante :

$ docker compose down
[+] Running 4/4
✔ Container wordpress-compose-wordpress-1 Removed 1.3s
✔ Container wordpress-compose-mariadb-1 Removed 0.4s
✔ Container wordpress-compose-phpmyadmin-1 Removed 1.3s
✔ Network wordpress-compose_default Removed 0.2s

Les volumes n’ont pas été supprimés :

$ docker volume ls
DRIVER VOLUME NAME
local wordpress-compose_blog-db-volume
local wordpress-compose_blog-wp-volume

Le cas échéant, je devrai les supprimer manuellement :

$ docker volume rm wordpress-compose_blog-db-volume
$ docker volume rm wordpress-compose_blog-wp-volume

Alternativement, la commande docker compose down –volumes permet de supprimer à la louche les conteneurs, les réseaux et les volumes.

Le fichier compose.yaml

Vous avez sans doute appliqué une petite dose de linguistique intuitive pour comprendre notre premier exemple de fichier compose.yaml. Sans aller dans les explications exhaustives qui épuisent le sujet aussi bien que le lecteur, relevons quand-même quelques détails dans la syntaxe de ce fichier.

En règle générale, compose.yaml commence avec un élément services suivi d’une liste indentée des services en question (en l’occurrence mariadb, phpmyadmin et wordpress).
Les propriétés de chaque service sont à nouveau indentées et définies par une série de mots-clés (image, volumes, environment, etc.).
L’indentation utilise deux espaces et pas de tabulations.
La section de premier niveau services peut être suivie d’autres sections de premier niveau comme volumes ou networks.
Le mot-clé image définit l’image Docker à utiliser.
La directive restart: always se charge de relancer les conteneurs même après un redémarrage de l’hôte.

Reportez-vous à la documentation officielle pour la référence complète :

https://docs.docker.com/compose/compose-file/

Exercice

Créez un répertoire de travail wordpress-exercice.
Placez-vous dans ce répertoire.
Essayez de reproduire la configuration décrite dans l’exercice précédent.
Servez-vous du fichier compose.yaml ci-dessus comme point de départ.
Démarrez la configuration avec docker compose.
Initialisez WordPress.
Ouvrez l’interface d’administration de PHPMyAdmin.
Notez les noms des trois conteneurs en cours d’exécution.
Notez le nom du réseau Docker qui relie les trois conteneurs.
Notez les noms des volumes pour les données persistantes.
Arrêtez et supprimez les conteneurs, le réseau et les volumes en utilisant une seule commande.

La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 

Me contacter