Docker Partie 3
Docker-Compose
Normalement, vous avez déjà une idée de ce qu’est Docker, et comment l’utiliser. Au moins vous captez le concept de base. Mais, si vous avez déjà essayé de lancer plusieurs conteneurs en même temps, vous avez dû vous rendre compte que c’est un peu complique. Vous devez lancer chaque conteneur un par un, et vous devez vous souvenir des commandes pour chaque conteneur. C’est là que Docker-Compose entre en jeu.
Surtout quand vous voulez les faire communiquer entre eux, c’est un peu complique. Vous devez vous souvenir des noms des conteneurs, des reseaux qui lui sont associés, des ports qu’ils exposent, etc…
Docker-Compose est un outil qui vous permet de définir et de lancer des applications multi-conteneurs. Avec Docker-Compose, vous pouvez utiliser un fichier YAML pour configurer vos services. Vous pouvez ensuite lancer tous vos services avec une seule commande.
Note: Docker-Compose est un outil qui est installé avec Docker. Donc, si vous avez déjà installé Docker, vous avez déjà Docker-Compose.
Un exemple simple
Pour commencer, je vais vous montrer un exemple simple. Nous allons créer un fichier compose.yaml
qui va lancer un conteneur nginx
et un conteneur mysql
. Voici le contenu du fichier docker-compose.yml
:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
Pour le moment rien de complique, nous avons juste deux services, web
et db
. Le service web
utilise l’image nginx:latest
, et il expose le port 80
du conteneur sur le port 8080
de l’hôte. Le service db
utilise l’image mysql:latest
, et il définit la variable d’environnement MYSQL_ROOT_PASSWORD
à example
.
Ce Docker-Compose, est la traduction exacte de ce que une commande docker run
ferait. :
docker run -d -p 8080:80 nginx:latest
docker run -d -e MYSQL_ROOT_PASSWORD=example mysql:latest
C’est juste qu’avec Docker-Compose, vous pouvez lancer les deux services en même temps. Et en plus vous pouvez envoyer ce fichier à un autre développeur, et il pourra lancer les mêmes services avec la même configuration. C’est très pratique.
Comme je l’ai ai dit dans la partie 2. Chaque image a ses propres variables d’environnement. Vous pouvez les trouver dans la documentation de l’image. Par exemple, pour l’image mysql
, vous pouvez trouver les variables d’environnement ici.
Du coup, pour lancer ces deux services, vous pouvez utiliser la commande suivante:
docker compose up
Et voila ! Vous avez lancé deux conteneurs en même temps. Cela dans cet exemple ne semble pas très utile, mais imaginez que vous avez une application qui utilise plusieurs services. Vous pouvez les lancer tous en même temps avec une seule commande. C’est très pratique.
Exemple plus complique
Pour vous expliquer toutes les options qu’on peut utiliser avec Docker-Compose, je vais vous donner un exemple plus complique. Nous allons créer un fichier docker-compose.yml
qui va lancer un tres fameux gestionnaire de logs, Graylog. Graylog est un outil open-source qui permet de collecter, d’analyser et de stocker des logs. Il est très utile pour les administrateurs système. Je ne vais pas vous expliquer comment utiliser Graylog, mais je vais vous montrer comment le lancer avec Docker-Compose.
Voici le contenu du fichier docker-compose.yml
:
version: '3'
services:
mongodb:
image: mongo:4
volumes:
- mongo_data:/data/db
restart: always
container_name: mongodb
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
environment:
- discovery.type=single-node
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data
restart: always
container_name: elasticsearch
graylog:
image: graylog/graylog:4.0
environment:
- GRAYLOG_HTTP_EXTERNAL_URI=http://
ports:
- "9000:9000"
- "514:514"
- "514:514/udp"
- "12201:12201"
- "12201:12201/udp"
depends_on:
- mongodb
- elasticsearch
volumes:
- graylog_journal:/usr/share/graylog/data/journal
- graylog_config:/usr/share/graylog/data/config
- graylog_plugins:/usr/share/graylog/data/plugin
restart: always
container_name: graylog
volumes:
mongo_data:
es_data:
graylog_journal:
graylog_config:
graylog_plugins:
Voila, un docker compose un poil plus complexe que le précédent. Nous avons trois services, mongodb
, elasticsearch
et graylog
. Le service mongodb
utilise l’image mongo:4
, et il monte un volume pour stocker les données. Le service elasticsearch
utilise l’image docker.elastic.co/elasticsearch/elasticsearch:7.10.2
, et il définit une variable d’environnement discovery.type
à single-node
. Le service graylog
utilise l’image graylog/graylog:4.0
, et il expose plusieurs ports. Il définit aussi une variable d’environnement GRAYLOG_HTTP_EXTERNAL_URI
à http://
. Il dépend aussi des services mongodb
et elasticsearch
. Il monte aussi plusieurs volumes pour stocker les données.
Je suis sur vous n’avez absolument rien compris. C’est normal, c’est un exemple complexe. Mais, je voulais juste vous montrer que vous pouvez faire des choses complique avec Docker-Compose. Vous pouvez lancer plusieurs services en même temps, et vous pouvez les faire communiquer entre eux.
Voila une explication de quelques option docker compose que vous pouvez utiliser dans un fichier compose.yaml
version
: La version de Docker-Compose. Vous pouvez utiliser la version 3 pour la plupart des cas.services
: Les services que vous voulez lancer. Chaque service a un nom, et vous pouvez définir plusieurs options pour chaque service. Vous pouvez définir l’image que vous voulez utiliser, les ports que vous voulez exposer, les variables d’environnement que vous voulez définir, etc. Les configurations que vous allez definir en dessous d’un service s’appliqueront seulement à ce service.volumes
: Les volumes ce sont des espaces de stockage persistant pour les conteneurs. Vous pouvez définir plusieurs volumes, et vous pouvez les utiliser dans les services.networks
: On s’attardera pas sur ce post mais c’est pour définir les réseaux que vous voulez utiliser. Vous pouvez définir plusieurs réseaux, et vous pouvez les utiliser dans les services.secrets
: Les secrets que vous voulez utiliser. Vous pouvez définir plusieurs secrets, et vous pouvez les utiliser dans les services.configs
: Les configurations que vous voulez utiliser. Vous pouvez définir plusieurs configurations, et vous pouvez les utiliser dans les services.restart
: L’action à prendre si le conteneur s’arrête. Vous pouvez définirno
pour ne pas redémarrer le conteneur,always
pour redémarrer le conteneur toujours,on-failure
pour redémarrer le conteneur seulement si il s’arrête avec une erreur, ouunless-stopped
pour redémarrer le conteneur sauf si vous l’arrêtez manuellement.depends_on
: Les services sur lesquels le service dépend. Vous pouvez définir plusieurs services, et vous pouvez les utiliser dans les services.container_name
: Le nom du conteneur. Vous pouvez définir un nom, et vous pouvez l’utiliser dans les services.ports
: Les ports que vous voulez exposer. Vous pouvez définir plusieurs ports, et vous pouvez les utiliser dans les services.environment
: Les variables d’environnement que vous voulez définir. Vous pouvez définir plusieurs variables, et vous pouvez les utiliser dans les services.- ….
Si jamais vous voulez des informations plus détaillées sur les options que vous pouvez utiliser dans un fichier compose.yaml
, vous pouvez consulter la documentation officielle ici.
Conclusion
Bon, peut être que je vous ai un peu perdu avec l’exemple de Graylog. Mais je voulais seulement vous montrer la puissance que docker compose peut vous offrir. Vous pouvez lancer plusieurs services en même temps, et en un claquement de doigts vous avez ce qui allait vous prendre des heures si vous aviez utilisé docker run
. V
J’espere que vous avez compris l’essentiel de Docker-Compose.