**Ceci est une ancienne révision du document !**
C'est quoi Docker Compose ?
Docker Compose est un outil d’orchestration de conteneurs.
Mais pourquoi diable un énième outil ?
Question:
C’est pas ce que fait déjà Docker, de gérer des conteneurs ?
Pour comprendre pourquoi on utilise un outil supplémentaire, il est utile de revenir à la page précédente, où on a fabriqué et lancé une image Docker. Le conteneur avait un nom, un mapping de ports et un montage. La commande pour le lancer était la suivante :
docker run -d --name quentin -p 80:80 -v quentin:/var/www/html nginx:quentin
C’est déjà long, et encore, il n’y a que quelques options. Imagine qu’à chaque mise à jour, il faille taper la même commande pour relancer le conteneur! C’est long et pénible, il y a des risques d’erreurs, la « configuration » du conteneur n’est jamais stockée quelque part…
Et c’est là qu’intervient Docker Compose. Compose permet de décrire à quoi doit ressembler un conteneur dans un fichier de configuration, et de gérer son cycle de vie avec des commandes simples.
C’est génial, parce que le fichier de configuration peut être versionné sur Git, partagé entre plusieurs machines et modifié collaborativement, contrairement à une grande ligne de commande.
Cas d'usage de Compose
Compose est particulièrement indiqué pour les applications avec plusieurs conteneurs. Par exemple, Mattermost n’est pas un seul conteneur : c’est un serveur web et une base de données. Compose permet de décrire les dépendances entre ces conteneurs, et de les lancer d’un seul coup.
Compose est aussi très utile pour déclarer des volumes ou des réseaux Docker, dont on reparlera avec Traefik.
Enfin, toutes les commandes Compose permettent de vérifier les journaux d’une application, de lister ses processus, de recréer intelligemment les conteneurs quand il y a besoin… Bref, on ne rentre pas dans tous les détails, place à la pratique!
Un détour par le format YAML
Les fichiers de configuration de Docker Compose sont au format YAML
. C’est un format qui exprime la « hiérarchie » par des espaces. Un exemple simple où je veux décrire des groupes de musiques et des salles de concert :
- snippet.yaml
artists: - title: System of a Down year: 1992 albums: - ... - title: Mansfield.TYA year: 2002 theaters: maroquinerie: title: La maroquinerie trianon: title: Le Trianon
On voit qu’il y a deux « blocs » de premier niveau, et qu’à chaque décalage on décrit quelque chose de plus précis. Ce qu’il y avant un :
s’appelle une clé et ce qu’il y a après s’appelle une valeur.
Note:
Il y a une différence subtile entre les artistes et les salles. Les artistes sont listés avec des -
alors que les salles n’ont pas de tiret. Pourquoi ?
C’est juste une histoire de nommage. Les artistes ne sont pas nommés, c’est simplement une liste. Ainsi, on pourrait dire « le premier artiste de artists
», mais on ne peut pas le désigner directement.
Les salles sont nommées, on peut s’y référer directement, par exemple dire la salle trianon
.
En YAML, quand on a pas besoin de se référer explicitement à des sous-éléments, on utilise des tirets, et sinon on les nomme et on utilise pas de tirets.
vim : un goût amer mais bien utile
La dernière fois, on a vu comment éditer un fichier avec nano
. nano
est bien pratique pour faire des petites modifications, mais est mauvais quand il s’agit d’éditer des fichiers YAML. Il n’y a pas de coloration syntaxique, pas d’espace automatique en allant à la ligne… c’est un enfer.
Je te propose donc de découvrir vim
, un éditeur plus difficile à prendre en main mais très pratique pour éditer des fichiers YAML!
On va faire au plus simple : tu ouvres ton fichier docker-compose.yml
avec vim
:
vim docker-compose.yml
Tu appuies sur I
pour rentrer en mode “insertion”. Tu écris ton texte. Quand tu as fini, tu appuies sur Échap
.
Enfin, tu appuies sur :
pour rentrer en mode « commande », tu écris « wq » (write and quit), puis Entrée
. Et voilà ! Ça peut paraître contre-intuitif parce qu’on ne rentre pas dans le pourquoi du comment, mais c’est tout ce que tu as besoin de savoir. Démonstration :
Note comment la barre du bas change au fil des commandes (I
puis :wq
).