Docker Compose

Présentation et intérêt

Docker Compose en quelques mots

Docker Compose est un outil écrit en Python qui permet de décrire dans un fichier les conteneurs que l’on souhaite faire fonctionner entre eux. Chaque conteneur pouvant être basé sur sa propre image. On parle alors d’un stack, concept que l’on retrouve également dans d’autres systèmes.

Ce fichier va donc permettre de décrire tous les images à utiliser dans des conteneurs pour un projet et comment ces conteneurs devront communiquer entre eux. Il sera alors possible d’installer et lancer l’image en une seule ligne de commande.

Ce fichier est nommé docker-compose.yml et est au format YAML. Il doit toujours être situé à la racine du projet.

Quelques cas concrets démontrant son intérêt

Le contexte

Vous travaillez au sein d’une équipe sur une application web basée sur le framework Symfony, utilisant donc le langage PHP avec une base de données MySQL et un serveur Apache, le tout reposant sur Ubuntu.

Cas n° 1 : Un nouveau développeur / un changement de machine

Même si grâce à Docker et aux images disponibles sur le Docker Hub l’installation de ces éléments est relativement rapide, il faut retenir les commandes et les exécuter chaque fois qu’un nouveau développeur arrive dans l’équipe ou même qu’un développeur déjà présent change de machine et doit donc réinstaller son environnement de développement. Cela prendra un certain temps alors qu’avec Docker Composer vous récupérez le fichier de la stack et la commande associée et, en une action, vous avez votre environnement 100% ISO à prêt à l’emploi.

Cas N° : Tester une montée de version

Toujours sur le même projet, imaginez que vous ayez besoin de migrer vers une nouvelle version de Symfony / PHP / MySQL, voir tous en même temps. Faire un nouvel environnement entièrement à la main prendrait du temps. De plus, chaque développeur serait ensuite contraint de répéter les mêmes opérations.

Grâce à Docker Composer, vous pouvez partir du même fichier de configuration pour en créer un nouveau et en y changeant uniquement les éléments souhaités, la version de PHP par exemple, pour tester votre application dans un second conteneur. Et vous pourriez rapidement repasser à l’ancien conteneur si besoin.

Cas n° 3 : Le déploiement en recette puis en production

Lorsque votre projet doit être déployé en recette client ou même en production, ces environnements peuvent être basés sur le même fichier de configuration, à quelques détails prêt. Lorsque votre configuration évolue, faire évoluer ces environnements est donc bien plus rapide. De plus, vous pourrez rapidement revenir à une configuration précédente si votre fichier de configuration est versionné.

Installation

Si on a installé Docker for Mac ou Docker for Windows, alors la dernière version de Docker Compose est automatiquement installée. Sur un poste Linux en revanche il faut le télécharger puis l’installer avec cette ligne de commande :

# Attention à remplacer par le n° de version applicable à l'instant d'exécution
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose && sudo chmod +x /usr/bin/docker-compose
 
# On peut vérifier que l'installation a bien eu lieu en affichant la version :
docker-compose --version

Le fichier docker-compose.yml

Le fichier doit tout d’abord indiquer la version de Docker Compose qu’il utilise. Selon la version, certains éléments ne sont pas disponibles et la syntaxe peut avoir évolué.

version: "3.9"

Il faut compléter une section services. Les services sont les différentes applications qui seront nécessaires à notre image. Chaque service (donc conteneur) pourra être nommé grâce à l’option container_name afin de mieux s’y retrouver et simplifier les lignes de commandes. Un service pouvant être une autre image, on indiquera dans l’option image du service le nom de l’image a utiliser avec d’éventuels tags.

Pour établir des liens en les services, il est possible d’indiquer des dépendances. On utilise pour cela l’option depends_on pour indiquer qu’un service dépend d’un autre, il en a besoin pour fonctionner.

Pour fonctionner un service peut également avoir besoin d’informations variables. Pour une BDD MySQL par exemple, ce serait les informations de connexion (identifiant, mot de passe). On indiquera ces variables dans une section environment du service.

Si un service nécessite d’établir une ouverture / redirection de ports on pourra utiliser la section ports.

S’il est nécessaire de pouvoir partager des fichiers entre le conteneur géré par Docker et notre système d’exploitation hôte quel qu’il soit, dans un sens comme dans l’autre, on pourra ajouter une section volumes.

Lancer un conteneur décrit via un fichier docker-compose.yml

Comme précisé plus haut, le fichier docker-compose.yml doit toujours être situé à la racine du projet concerné. Ainsi, pour lancer le conteneur il suffira de se positionner dans le répertoire de projet et d’exécuter une simple commande comme dans l’exemple suivant. Docker créera alors chaque sous-conteneur du fichier docker-compose.yml.

# Se rendre dans le répertoire du projet
# Le fichier docker-compose.yml y est à la racine
cd /sites/projet_test-1/

# Lancer le conteneur
docker-compose up -d

# Résultat afficher par Docker dans la console
Creating nom_du_1er_conteneur
Creating nom_du_2n_conteneur