Bonjour à tous,
Aujourd’hui dans cet article, je vais tenter de vous expliquer la différence entre la commande docker run et l’utilisation de docker-compose.
Cet article s’adresse principalement aux personnes qui commence avec les conteneurs et Docker. Je précise aussi que je ne vais rentrer dans une utilisation avancée de docker-compose.
Quand on commence avec les conteneurs et particulièrement avec Docker, on se retrouve souvent confronter à docker run
et docker-compose
et cela peut par être déroutant au début et faire « peur » en ajoutant de la complexité.
Pour illustrer l’article, je vais déployer deux conteneurs MariaDB et je vais utiliser l’image disponible sur le Hub.
docker run
La commande docker run
<paramètres> <image> permet comme son « nom l’indique » de créer un conteneur et de le démarrer.
Ne pas confondre avec
docker start
qui permet de redémarrer un conteneur
Revenons à notre image MariaDB, si l’on regarde la documentation de l’image, il faut executer la commande ci-dessous pour créer un conteneur basé sur l’image MariaDB :
docker run -p 127.0.0.1:3306:3306 --name some-mariadb -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:tag
Dans la réalité, si l’on souhaite mettre en place un conteneur MariaDB, nous allons certainement ajouter quelques paramètres afin que celui-ci soit toujours démarrer et certainement utiliser un paramètre –v
pour avoir un stockage persistant.
Ce qui nous donne quelque chose de comme ça :
docker run -p 3306:3306 -v /var/mariadb_c1:/var/lib/mysql --name mariadb-c1 --restart always -e MARIADB_ROOT_PASSWORD=Azerty123 -d mariadb:latest
Ce qui nous donne :
Le conteneur est créé et démarré sans problème.
Ce qu’il faut penser à faire, c’est de bien noté quelque part, la commande qui permit de démarrer le conteneur, pourquoi ? Simplement quand vous voudrez mettre à jour l’image, vous allez devoir d’abord arrêter le conteneur, le supprimer puis le recréer et comme on a un stockage persistant sur l’hôte si on régénère le conteneur avec la même image (latest) et les mêmes paramètres tout refonctionne normalement, mais il faut penser à noter la commande sur pense-bête. C’est là où docker-compose va nous aider.
docker-compose
Pour faire simple, docker-compose est composant supplémentaire de Docker, qui permet de configurer les conteneurs à l’aide d’un fichier de configuration au format YAML. Une fois la configuration écrite, il suffit de lancer (démarrer) le conteneur en indiquant le fichier de configuration.
Une utilisation plus poussée de docker-compose permet de créer des configurations multi-conteneurs en une seule commande.
La première étape, c’est d’installer docker-compose.
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Une fois télécharger, il faut donner le droit d’execution :
sudo chmod +x /usr/local/bin/docker-compose
docker-compose est installé, on peut le tester à l’aide de la commande :
docker-compose --version
Nous allons maintenant passer à son utilisation, comme pour docker run, on va regarder ce que nous propose la documentation de l’image :
On peut voir que les conteneurs sont déclarés comme des services et que ici nous en avons deux :
- db qui est l’image MariaDB
- adminer qui est une interface web de gestion pour MariaDB.
Le vrai intérêt de docker-compose est de lancer des groupes de conteneur, mais ici nous allons voir comment lancer un conteneur
La première étape, c’est de créer un dossier dans lequel nous allons mettre notre fichier docker-compose.yml et les données.
Personnellement, j’ai créé un dossier containers à la racine.
(sudo) mkdir mariadb_c2
Aller dans le dossier
cd <NomDuDossier>
Créer un fichier docker-compose.yml
(sudo) touch docker-compose.yml
Voici le contenu du fichier :
Personnellement, je les édite sous Visual Studio Code et je colle après le contenu à l’aide de nano.
Ici notre fichier docker-compose va créer un service mariadb avec les même paramètres que la commande docker run sauf que j’expose le port 3307, car le 3306 est utilisé par notre premier conteneur.
Pour démarrer notre conteneur, sil suffut d’utiliser la commande ci-dessous dans le dossier où se trouve le fichier docker-compose;yml :
docker-compose up -d
Si on regarde nos conteneurs, on voit bien le conteneur mariadb_c2 et on s’aperçoit qu’il fait partie d’un stack, ce qui est normale quand on utilise docker-compose, l’outil est fait pour lancer plusieurs conteneurs.
Si on regarde dans le détail notre conteneur, on retrouve nos paramètres, dans la section LABELS, on voit que celui-ci a été lancé avec docker-compose. Un autre particularité avec docker-compose, pour chaque stack un réseau est créé.
Comme vous pouvez le voir, l’avantage d’utiliser docker-compose, c’est d’avoir toujours une trace (fichier) de ce qui nous permit de créer le conteneur.
Après avec le temps, c’est aussi de pouvoir créer des stacks pour faire fonctionner des applications plus complexes.
Ce que je fais pour sauvegarder mes fichiers docker-compose.yml et aussi de pouvoir les suivre facilement, c’est d’utiliser un dépôt git.
J’espère que cet article vous a aidé à voir plus clair sur docker run et docker-compose.