3.1 Fichier compose.yaml
Le fichier compose.yaml
(ou l'une des variantes suivantes : docker-compose.yaml
, docker-compose.yml
, compose.yml
) — c'est le fichier de configuration principal utilisé par Docker Compose pour définir et gérer des applications multi-éléments. Il décrit quels conteneurs (services) doivent être lancés, comment ils interagissent entre eux et quelles ressources ils nécessitent.
Pour être cohérents dans cette conférence, nous utiliserons la variante compose.yaml
, car elle est recommandée pour les versions modernes de Docker Compose.
Structure du fichier compose.yaml
Le fichier compose.yaml
contient plusieurs sections, chacune décrivant différents aspects de la configuration d'une application. Les principales sections incluent :
- version : spécifie la version du fichier Compose (par exemple,
'3.9'
). - services : décrit les conteneurs (services), leurs configurations et dépendances.
- volumes : définit les volumes pour stocker les données entre les conteneurs et l'hôte.
- networks : configure les réseaux par lesquels les services communiquent entre eux.
3.2 Directives principales
1. version
La directive version définit la version de la syntaxe Docker Compose utilisée dans le fichier compose.yaml
. Au moment de la rédaction de cet article, la version la plus récente est la version 3, notamment ses mises à jour comme les versions 3.8 et 3.9.
version: '3.9'
2. services
La section services définit les conteneurs que Compose doit créer et lancer. Chaque service représente un conteneur individuel avec une configuration spécifique.
Exemple :
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
Dans cet exemple, deux services sont définis : web
et db
. Le service web
utilise l'image nginx:latest
et ouvre le port 80. Le service db
utilise l'image mongo:latest
et attache un volume pour le stockage des données.
3. volumes
La section volumes est utilisée pour définir les volumes qui peuvent être attachés aux conteneurs pour le stockage des données. Cela est utile pour préserver les données lorsque les conteneurs sont redémarrés.
Exemple :
volumes:
mongo-data:
4. networks
La section networks permet de définir des réseaux personnalisés où travailleront les conteneurs. Cela assure l'isolation et la configuration des connexions réseau. Si aucun réseau n'est spécifié, Docker Compose créera un réseau par défaut, et tous les services y seront connectés.
Exemple :
networks:
front-end:
back-end:
3.3 Directives pour configurer les services
Les directives principales pour configurer les services :
1. image
La directive image spécifie l'image qui sera utilisée pour créer un conteneur.
Exemple :
services:
web:
image: nginx:latest
2. build
La directive build est utilisée pour indiquer le chemin vers le Dockerfile qui doit être utilisé pour construire l'image.
Exemple :
services:
app:
build: ./app
3. ports
La directive ports définit les ports qui doivent être ouverts et redirigés de la machine hôte vers le conteneur.
Exemple :
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
La directive volumes monte les volumes dans les conteneurs, permettant de conserver les données entre les redémarrages des conteneurs.
Exemple :
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
La directive environment définit les variables d'environnement pour le conteneur.
Exemple :
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
La directive depends_on indique que ce service dépend d'autres services et doit être démarré après eux.
Important !
Lors du démarrage de votre service, il n'y a aucune garantie à 100 % que tous les services nécessaires à son fonctionnement soient complètement prêts. Ils seront démarrés — oui, mais leur bon fonctionnement ultérieur n'est pas garanti. Ce problème est résolu avec des health-check, mais cela viendra plus tard.
Exemple :
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
La directive command permet de redéfinir la commande qui sera exécutée lors du démarrage du conteneur.
Exemple :
services:
app:
image: myapp:latest
command: python app.py
8. networks
La directive networks connecte un service à un ou plusieurs réseaux.
Exemple :
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Exemple complet
Exemple d'un fichier complet compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
Dans cet exemple :
- Trois services sont définis :
web
,app
etdb
. -
web
utilise une image Nginx, monte un fichier de configuration et dépend du serviceapp
. -
app
est construit à partir d'un Dockerfile local, monte le code source de l'application et utilise des variables d'environnement. -
db
utilise une image MongoDB et monte un volume pour le stockage des données. - Deux volumes et deux réseaux sont créés pour l'isolation et la gestion de l'interaction entre les services.
Note : un volume est mongo-data
, et un autre est un répertoire monté de la machine hôte (par exemple, ./app
).
GO TO FULL VERSION