Date : 12 février 2021 - Révisé le 2025.12.04
Lors des laboratoires précédents, nous avons démarré des conteneurs en utilisant la ligne de commande (docker run). Nous avons procédé ainsi car les paramÚtres de configuration étaient simples ou que le nombre de conteneurs pour une application donnée était réduit.
Dans le cas dâune application multi-services nĂ©cessitant un nombre Ă©levĂ© de micro-services, des rĂ©seaux personnalisĂ©s ou des volumes persistants, lâapproche de dĂ©marrage manuel de chacun des services peut devenir une tĂąche ardue et complexe.
Pour adresser ce type de problĂšme, Docker propose le module docker-compose.
En utilisant le langage de reprĂ©sentation des donnĂ©es YAML, il est possible de reprĂ©senter tous les services et paramĂštres dâun systĂšme donnĂ© et de dĂ©marrer le tout en une seule ligne de commande.
Voici un tableau prĂ©sentant les analogies entre lâutilisation du CLI de Docker et de docker-compose :

docker-compose.yml |
Ăquivalent docker run |
Description |
|---|---|---|
services: |
docker run |
Chaque entrée est un conteneur (service). |
image: |
IMAGE |
Nom de lâimage (ex: alpine:latest). |
container_name: |
--name |
Nom du conteneur. |
ports: |
-p |
Liaison de ports (ex: "8080:80"). |
volumes: |
-v |
Liaison de volumes. |
networks: |
--network |
Spécification des réseaux. |
environment: |
-e |
Variables dâenvironnement. |
stdin_open: true |
-i |
Garde le stdin ouvert. |
tty: true |
-t |
Alloue un pseudo-TTY. |
depends_on: |
(Aucun) | DĂ©finit lâordre de dĂ©marrage des services. |
build: |
docker build |
Spécifie un Dockerfile à construire. |
Par les exemples suivants, nous verrons comment ça fonctionne.
Créons le fichier docker-compose.yml :
# Fichier: docker-compose.yml
# Auteur: Alain Boudreault
# Date: 2021.02.13
# Description: Mise en place d'un systĂšme de 3 alpine
version: "3.9"
services:
srv01:
image: alpine
container_name: serveur01 # Optionnel
srv02:
image: alpine
container_name: serveur02 # Optionnel
srv03:
image: alpine
container_name: serveur03 # Optionnel
Note : Voici le tableau de compatibilité des versions : https://docs.docker.com/compose/compose-file/compose-file-v3/
docker-compose up
Résultat :
Creating network "lab01-docker-compose_default" with the default driver
Pulling srv01 (alpine:)...
...
Status: Downloaded newer image for alpine:latest
Creating serveur02 ... done
Creating serveur01 ... done
Creating serveur03 ... done
Attaching to serveur02, serveur01, serveur03
serveur02 exited with code 0
serveur01 exited with code 0
serveur03 exited with code 0
Observation :
alpine nâa pas de service dâarriĂšre-plan par dĂ©faut et la commande par dĂ©faut est complĂ©tĂ©e immĂ©diatement).Ăquivalent docker run :
docker create network lab01-docker-compose_default
docker run --name serveur01 --network lab01-docker-compose_default alpine
docker run --name serveur02 --network lab01-docker-compose_default alpine
docker run --name serveur03 --network lab01-docker-compose_default alpine
docker container ls (-a)
docker container stop $(docker container ls -aq)
docker system prune -af --volumes
-d)docker-compose up -d
NOTE : Les conteneurs seront arrĂȘtĂ©s quand mĂȘme sâils nâont pas de commande persistante (comme un shell interactif ou un processus serveur).
attach et ping entre les servicesPour un conteneur qui tourne (par exemple, si vous y avez ajouté une commande persistante comme sleep 3600) :
docker attach serveur01
ping serveur02
CTRL+PQ
Directive compose |
Ăquivalent docker run |
|---|---|
stdin_open |
-i |
tty |
-t |
networks |
--net |
environment |
-e |
docker-compose.ymlNous ajoutons des options interactives (stdin_open, tty), un rĂ©seau personnalisĂ© (reseauAlpine) et des variables dâenvironnement.
version: "3.9"
services:
srv01:
image: alpine
container_name: serveur01
stdin_open: true # docker run -i
tty: true # docker run -t
networks:
- reseauAlpine
environment:
- JESUIS=Le spécialiste de la paresse
# command: sh # Décommenter pour laisser le conteneur actif
srv02:
image: alpine
container_name: serveur02
stdin_open: true # docker run -i
tty: true # docker run -t
networks:
- reseauAlpine
environment:
- JESUIS=Celui qui fait du sur place
# command: top # Décommenter pour laisser le conteneur actif
networks:
reseauAlpine:
name: jeSuisLeReseauAlpine
driver: bridge
Note : Pour les variables dâenvironnement, il est possible dâutiliser les trois syntaxes suivantes :
Paires Clé:Valeur :
environment:
MYSQL_ROOT_PASSWORD: donttell
MYSQL_USER: Bob
Tableau de chaĂźnes sans guillemets :
environment:
- MYSQL_ROOT_PASSWORD=donttell
Tableau de chaĂźnes avec guillemets :
environment:
- "MYSQL_ROOT_PASSWORD=donttell"
-d)(VĂ©rifier le rĂ©seau créé, lâĂ©tat des conteneurs, et les variables dâenvironnement.)
Directive compose |
Ăquivalent docker run |
|---|---|
volumes |
-v |
ports |
-p |
docker-comp01.yml# Fichier: docker-comp01.yml
version: "3.9"
services:
srv99:
image: alpine
container_name: serveur99
stdin_open: true # docker run -i
tty: true # docker run -t
volumes:
- ./:/420
# command: sh # Ajouter cette ligne pour garder le conteneur actif
docker-compose -f docker-comp01.yml up -d
docker exec -it serveur99 /bin/sh
/ # ls
/ # ls /420
/ # touch /420/note.txt
(Le fichier note.txt est créé dans le répertoire hÎte courant grùce à la liaison de volume.)
Exemple de configuration utilisant les volumes (pour le fichier de configuration et le contenu Web) et les ports.
version: "3.9"
services:
serveurweb:
image: nginx
container_name: serveurWEB
volumes:
- ./templates/site.template:/etc/nginx/templates
- ./contenuweb:/usr/share/nginx/html:rw
ports:
- "8080:80"
environment:
- NGINX_HOST=monServeurWeb.com
- NGINX_PORT=80 # N'est pas utilisée dans cet exemple
Document rédigé par Alain Boudreault © 2021-2026
Version 2025.12.03.1
Site par ve2cuy