Docker Compose est un outil d’orchestration de conteneurs.

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.

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!

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.

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).

  • technique/tech_team/pres_compose.1637014794.txt.gz
  • de qduchemi