Docker Compose est un outil open-source développé par Docker, conçu pour simplifier la gestion et l’exécution de plusieurs conteneurs simultanément. Il permet de définir et de coordonner des serviecs (conteneurs) au sein d’un projet unique, le tout via un fichier YAML déclaratif. L’objectif est d’éviter de devoir lancer manuellement chaque conteneur avec des commandes docker run répétitives.
Concepts clés
- Service : un conteneur ou une application (ex. base de données, serveur web).
- Projet : ensemble de services qui fonctionnent ensemble pour former une application complète.
Installation de Docker Compose
L’installation sous Linux se fait en téléchargeant le binaire et en le rendant exécutable. Comme le site officiel peut être lent, on utilise le miroir chinois DaoCloud :
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version # Vérifier l'installation
Structure d'un fichier docker-compose.yml
Le fichier YAML déclare les services, les volumes et les réseaux. Voici les directives les plus courantes :
build: construit une image à partir d'un Dockerfile.image: utilise une image existante.ports: mappe les ports (ex. "80:8080", de préférence sous forme de chaîne).volumes: monte des volumes nommés ou des chemins hôtes.networks: attache le service à un réseau défini.depends_on: ordonne le démarrage des services (dépendances).environmentouenv_file: définit des variables d’environnement (le fichier .env évite d’exposer des données sensibles).healthcheck: vérifie l’état de santé du conteneur.command: remplace la commande par défaut du conteneur.
Exemple de fichier docker-compose.yml utilisant des services personnalisés (variables et noms modifiés pour l’exemple) :
version: "3.8"
services:
webapp:
container_name: frontend-app
build:
context: ./web
dockerfile: Dockerfile.web
ports:
- "8080:80"
volumes:
- webdata:/var/www/html
networks:
- app-net
depends_on:
- db
- cache
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
db:
container_name: mysql-db
image: mysql:8.0
ports:
- "3307:3306"
volumes:
- dbconf:/etc/mysql
networks:
- app-net
environment:
- MYSQL_ROOT_PASSWORD=mysecret
env_file: ./db.env
cache:
container_name: redis-cache
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- cachedata:/data
networks:
- app-net
command: "redis-server --appendonly yes"
volumes:
webdata:
external: false # sera créé automatiquement (prefixe = projet_webdata)
dbconf:
cachedata:
networks:
app-net:
external: false # réseau créé automatiquement (projet_app-net)
Lorsque external: false, le nom réel du volume ou du réseau est préfixé par le nom du projet. Pour utiliser un volume ou réseau existant, mettre external: true et s’assurer qu’il a été créé au préalable.
Utilisation de build dans Compose
La directive build permet de construire une image à partir d’un Dockerfile avant de lancer le conteneur. Exemple :
version: "3.8"
services:
custom-centos:
build:
context: ./centos
dockerfile: Dockerfile.centos
container_name: centos-dev
networks:
- dev-net
command: "/bin/bash"
networks:
dev-net:
external: true # suppose que le réseau 'dev-net' a été créé manuellement
Commandes courantes de Docker Compose
docker-compose up: démarre tous les services du projet.docker-compose down: arrête et supprime les conteneurs, réseaux (et volumes si-v).docker-compose ps: liste les conteneurs du projet.docker-compose logs: affiche les logs.docker-compose exec <service> <commande>: exécute une commande dans un service en cours.
Règles de syntaxe YAML
- Après une clé et avant sa valeur, un espace est obligatoire (ex.
version: "3"). - Les listes sont indentées avec un tiret précédé d’un espace (ex.
ports:→- "8080:80"). - Un fichier
.envcontient des lignesKEY=VALUEsans guillemets.