Docker Compose
L'outil qui simplifie la gestion d'applications multi-conteneurs Docker en permettant de définir et d'exécuter tous vos services avec un simple fichier de configuration.
Qu'est-ce que Docker Compose ?
Imaginez que vous deviez organiser un événement qui nécessite plusieurs services : un traiteur, un DJ, un photographe, etc. Au lieu de coordonner chaque prestataire individuellement, vous pourriez engager un organisateur d'événements qui s'occupe de synchroniser tous ces services selon vos instructions.
Docker Compose joue ce rôle d'organisateur pour vos applications. Il permet de définir et de gérer plusieurs conteneurs Docker (chacun exécutant un service différent) comme une seule application cohérente.
Pourquoi est-ce utile ?
Simplicité
Définissez tous vos services, réseaux et volumes dans un seul fichier, puis démarrez tout votre environnement avec une seule commande.
Reproductibilité
Assurez-vous que tous les membres de l'équipe travaillent avec exactement le même environnement, éliminant le fameux "ça marche sur ma machine".
En résumé, Docker Compose transforme ce qui serait normalement un processus fastidieux de démarrage, connexion et configuration de multiples conteneurs en une seule commande simple. C'est particulièrement utile pour les applications modernes qui utilisent souvent plusieurs services interconnectés.
Fonctionnement technique
Docker Compose est un outil qui permet de définir et d'exécuter des applications Docker multi-conteneurs. Il utilise des fichiers YAML pour configurer les services d'une application, puis avec une seule commande, il crée et démarre tous les services depuis la configuration.
Le fichier docker-compose.yml
Structure de base
Un fichier docker-compose.yml typique contient les sections suivantes:
- version : La version de la syntaxe de Compose utilisée
- services : Définition des conteneurs à exécuter
- volumes : Définition des volumes pour le stockage persistant
- networks : Configuration des réseaux pour la communication entre conteneurs
version: '3.8'
services:
# Service pour l'application web
webapp:
build:
context: ./webapp
dockerfile: Dockerfile
image: my-webapp:latest
container_name: webapp
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
- DB_NAME=mydatabase
- DB_USER=myuser
- DB_PASSWORD=mypassword
volumes:
- webapp_data:/app/data
depends_on:
- db
networks:
- app_network
# Service pour la base de données
db:
image: postgres:14-alpine
container_name: postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_DB=mydatabase
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
volumes:
webapp_data:
driver: local
postgres_data:
driver: local
networks:
app_network:
driver: bridge
Commandes essentielles
Voici les commandes de base pour travailler avec Docker Compose:
# Démarrer les services définis dans docker-compose.yml
docker compose up -d
# Voir l'état des services
docker compose ps
# Voir les logs des services
docker compose logs
# Suivre les logs en temps réel
docker compose logs -f
# Arrêter les services
docker compose stop
# Arrêter et supprimer les conteneurs, réseaux et volumes
docker compose down
# Reconstruire les images et démarrer les services
docker compose up -d --build
# Exécuter une commande dans un service spécifique
docker compose exec webapp npm run migrate
# Voir l'utilisation des ressources
docker compose top
# Mettre à l'échelle un service à plusieurs instances
docker compose up -d --scale webapp=3
Configuration multi-environnement
Docker Compose permet d'utiliser plusieurs fichiers pour différents environnements grâce à l'extension et à la surcharge:
# docker-compose.yml (fichier principal)
version: '3.8'
services:
webapp:
image: myapp:latest
ports:
- "3000:3000"
environment:
- NODE_ENV=production
# ...
# docker-compose.override.yml (environnement de développement)
version: '3.8'
services:
webapp:
build: ./
volumes:
- ./:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DEBUG=app:*
command: npm run dev
# ...
Par défaut, Docker Compose charge docker-compose.yml
puis docker-compose.override.yml
si présent. Vous pouvez spécifier d'autres fichiers avec l'option -f
.
Profils
Les profils permettent de démarrer des ensembles spécifiques de services selon les besoins:
version: '3.8'
services:
webapp:
image: myapp:latest
ports:
- "3000:3000"
profiles: ["web", "frontend", "dev"]
db:
image: postgres:14
ports:
- "5432:5432"
profiles: ["db", "backend", "dev"]
redis:
image: redis:alpine
ports:
- "6379:6379"
profiles: ["cache", "backend", "dev"]
elasticsearch:
image: elasticsearch:7
ports:
- "9200:9200"
profiles: ["search", "optional"]
# Démarrer uniquement les services web
# docker compose --profile web up -d
# Démarrer les services backend
# docker compose --profile backend up -d
# Démarrer tout l'environnement de développement
# docker compose --profile dev up -d
Concepts clés
- Services : Représentent des conteneurs qui seront exécutés, avec leur configuration spécifique
- Volumes : Permettent de persister et de partager des données entre les conteneurs ou avec le système hôte
- Networks : Facilitent la communication isolée et sécurisée entre les services
- Depends On : Gère l'ordre de démarrage des services en fonction de leurs dépendances
- Environment : Injecte des variables d'environnement dans les conteneurs
- Ports : Configure le transfert de ports entre les conteneurs et l'hôte
Fonctionnalités avancées
- Scaling : Création de plusieurs instances d'un service avec
docker compose up --scale service=N
- Healthchecks : Configurations pour vérifier l'état de santé des services
- Secrets : Gestion sécurisée des données sensibles
- Configs : Configuration externe que les services peuvent monter
- Deploy : Options de déploiement pour les environnements d'orchestration comme Docker Swarm
- Extension Fields : Permet d'étendre la configuration avec des champs personnalisés
Bonnes pratiques
- Séparation des fichiers : Utiliser plusieurs fichiers Compose pour différents environnements (dev, staging, prod)
- Gestion des secrets : Ne jamais stocker de secrets en clair dans les fichiers Compose, utiliser des variables d'environnement ou Docker secrets
- Nommage explicite : Nommer clairement les conteneurs, volumes et réseaux pour une meilleure maintenance
- Versions spécifiques : Spécifier des versions précises des images pour garantir la reproductibilité
- Optimisation des volumes : Utiliser des volumes nommés plutôt que des bind mounts quand c'est possible
- Documentation : Documenter les services, leurs dépendances et les variables d'environnement requises
Cas d'usage
Environnements de développement
Créez un environnement de développement standardisé incluant tous les services nécessaires (web, base de données, cache, etc.) avec une seule commande, permettant à tous les développeurs de travailler dans des conditions identiques.
Tests automatisés
Configurez des environnements de test complets avec des bases de données temporaires, des services simulés et des outils de test intégrés comme Jest ou
Cypress, facilitant les tests d'intégration fiables et reproductibles.
Déploiement d'applications microservices
Déployez facilement des applications composées de multiples microservices interconnectés, chacun ayant sa propre configuration, mais fonctionnant comme un tout cohérent.
Démonstrations et formations
Créez des environnements de démonstration complets et prêts à l'emploi pour présenter des produits ou former de nouveaux utilisateurs, sans aucune configuration manuelle requise.
Docker Compose vs Alternatives
Voici comment Docker Compose se compare à d'autres solutions d'orchestration:
Outil | Cas d'usage principal | Échelle |
---|---|---|
Docker Compose | Environnement de développement, applications simples | Petite à moyenne |
Kubernetes | Orchestration d'applications à grande échelle, production | Grande à très grande |
Docker Swarm | Clustering et orchestration simplifiés | Moyenne |
Nomad | Orchestration multi-technologie (pas uniquement Docker) | Moyenne à grande |