Dans l’article précédent, nous avons vu comment créer un unique container avec Docker. Nous allons maintenant voir comment créer un stack de containers. Ce stack va contenir plusieurs containers qui représentent différents services.

Docker-compose fonctionne à partir d’un fichier yml, dans lequel on défini tous les services que l’on souhaite. Quand on lance la commande d’exécution, le Daemon Docker va lire le docker-compose.yml afin de monter chaque container avec les paramètres que l’on a choisi.

Architecture de docker-compose

La base

Avant d’écrire le fichier yml, il faut créer un répertoire où seront enregistrés tous les dossiers et fichiers nécessaires à docker-compose. Pour cela on utilise la commande suivante:

mkdir <NOM REPERTOIRE>

On se déplace dans ce nouveau répertoire (avec la commande cd <NOM REPERTOIRE>) où l’on va éditer le fichier yml. Attention, le fichier yml doit obligatoirement s’intituler “docker-compose.yml”.

Dans un premier temps, nous instancierons un seul service, ce qui permet de vérifier son bon fonctionnement.

version: '3.3'

services:
  database:
     image: 'mariadb:10.3'
     container_name: 'database'
     restart: always
     environment:
        MYSQL_USER: user
        MYSQL_USER_PASSWORD: mypassword
        MYSQL_DATABASE: my_database
        MYSQL_ROOT_PASSWORD: root_password
        
     ports:
        - '3306:3306'

Attention: le fichier docker-compose.yml est très sensible aux indentations, un espace manquant ou en trop et une erreur sera signifiée. Pour vérifier la validité de votre fichier vous pouvez utiliser un site très utile et qui fait gagner du temps.

Les explication ligne par ligne:

  • Pour chaque fichier yml il faut définir la version. Pour ma part, j’utilise la 3.3
  • avec ‘services’ on défini chaque service
  • ‘database’ sera le nom donné au container, son ID
  • ‘image: mariadb:10.3’ on indique quelle image sera utilisée pour le service. Ici, on peut voir que le nom de l’image est suivi par ‘:10.3’ c’est un tag qui permet d’indiquer quelle version de l’image est utilisée. Si on omet le tag, l’image utilisée sera la ‘latest’. Ce qui peut être problématique dans certains cas, dans certaines mises à jour des erreurs peuvent apparaître et empêcher le bon fonctionnement des services alors qu’auparavant tout ce déroulait correctement.
  • Pour plus de facilité, on nomme directement le container. (Il est en effet plus aisé de se connecter à un container dont on connait le nom, plutôt que d’utiliser le nom donné par Docker, qui prend le nom du répertoire de travail, colle le nom du container et un numéro.)
  • ‘restart: always’ indique que le service doit constamment redémarrer afin que les mises à jour soient prises en compte.
  • ‘environment’ dans cette partie on indique le nom de l’utilisateur, son mot de passe, le nom de la base de données et le mot de passe de root. Cette façon de faire n’est certainement la bonne, puisque les mots de passe sont en clair dans notre fichier. Cependant, nous procèderons de cette manière dans un premier temps afin de nous familiariser avec docker-compose. Nous verrons ultérieurement comment sécuriser notre infrastructure.
  • ‘ports’ cette section permet de définir les ports de connexion au service. Pour le SQL c’est le port 3306 qui est utilisé.

On enregistre notre fichier yml et on lance le docker-compose dans notre répertoire de travail.

docker-compose up

Cette commande permet de lancer la création du container. Nous pouvons voir dans le terminal toute la procédure ainsi que les éventuelles erreurs.

Pour avoir la liste de tous les containers créés il suffit de taper la commande:

docker ps -a

Le résultat de cette commande donne un tableau dans lequel on retrouve l’ID du container, l’image utilisée pour le fabriquer, la commande appelée,la date/ l’heure de sa création, le statut du container, le port sur lequel il écoute et le nom du container.

Pour arrêter les containers on utilise les touches CTRl+C. Il ne faut pas oublier de faire régulièrement le ménage des containers présents sur la machine en utilisant:

docker container prune

Ou:

docker-compose down

La commande précédente permet d’arrêter les containers et de les supprimer.

Nous pouvons voir qu’avec la commande de lancement des containers, nous n’avons plus la main sur le terminal. Pour modifier cela, on peut ouvrir un nouveau terminal, ou passer une option dans la commande:

docker-compose up -d

Avec l’option -d les containers sont créés et tournent en tâche de fond.

Les volumes

Notre de base de données est maintenant prête à être instanciée. Cependant il manque la persistance des données. En effet, actuellement si l’on fabrique une base et des tables dans lesquelles on insère des données et que l’on éteint les containers, tout sera perdu lorsque l’on relancera les containers.

Pour cela nous allons ajouter une ligne dans notre fichier docker-compose.yml afin que tout ce qui sera fait manuellement soit automatiquement sauvegardé. On se place juste après la partie ports où l’on tape:

# l'alignement doit être le même que pour les autres parties
    volumes:
        - ${PWD}/mariadb/:/var/lib/mysql/

Le ${PWD} indique le chemin jusqu’à l’endroit où on se situe. Ensuite on donne un nom au dossier que Docker va créer et qui servira à la persistance des données.

Se connecter au container

Pour se connecter au container, on tape dans un terminal la commande:

docker exec -it <NOM CONTAINER> /bin/sh

On remarque alors que le prompt change et un # apparaît. On peut taper:

mysql -p

Et enfin, on saisit le mot de passe de root. Il est maintenant possible de créer une nouvelle base de données ainsi que des tables et des utilisateurs. Pour quitter, il suffit de faire CTRL+C, on se trouve alors dans le container et ensuite CTRL+D. Nous ne sommes plus dans le container.

Nous avons maintenant les bases de docker-compose. Dans l’article suivant nous allons ajouter des containers qui serviront à administrer la base de données.

Catégories : Docker