Docker Compose : introduction simple
Quand un projet utilise plusieurs conteneurs (par exemple : une app web + une base de données), gérer tout à la main devient vite compliqué. Docker Compose permet de définir et lancer plusieurs servic…
Progression
8 / 8
Derniere mise a jour
24 sept. 2025
Etat
A jour
Quand un projet utilise plusieurs conteneurs (par exemple : une app web + une base de données), gérer tout à la main devient vite compliqué. Docker Compose permet de définir et lancer plusieurs services Docker avec un seul fichier.
Qu'est-ce que Docker Compose ?
Docker Compose est un outil qui permet de définir et gérer des applications multi-conteneurs à l'aide d'un fichier YAML. Au lieu de lancer plusieurs commandes docker run, vous décrivez votre infrastructure complète dans un fichier compose.yml.
Qu'est-ce que compose.yml ?
C'est un fichier YAML dans lequel tu décris :
- Les services (conteneurs)
- Les volumes pour la persistance
- Les réseaux pour la communication
- Les variables d'environnement
- Les ports à exposer
Exemple simple : App web + Base de données
Structure du projet
mon-projet/
├── compose.yml
├── app/
│ ├── Dockerfile
│ └── main.py
└── .env
compose.yml
services:
web:
build: ./app
ports:
- "5000:5000"
volumes:
- ./app:/app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres_data:Commandes de base
Lancer tous les services
docker compose upOptions utiles :
-d: en arrière-plan--build: force la reconstruction des images
Arrêter et supprimer les conteneurs
docker compose downVoir les services en cours
docker compose psVoir les logs
docker compose logs
docker compose logs web # logs d'un service spécifique
docker compose logs -f # suivi en temps réelReconstruire les images
docker compose build
docker compose up --buildExemple complet avec plusieurs services
services:
# Application web
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
environment:
- REACT_APP_API_URL=http://localhost:8000
# API Backend
backend:
build: ./backend
ports:
- "8000:8000"
volumes:
- ./backend:/app
environment:
- DATABASE_URL=postgresql://postgres:password@database:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- database
- redis
# Base de données
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
# Cache Redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# Nginx reverse proxy
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- frontend
- backend
volumes:
db_data:
redis_data:
networks:
default:
name: myapp_networkGestion des variables d'environnement
Fichier .env
# Base de données
POSTGRES_DB=myapp
POSTGRES_USER=postgres
POSTGRES_PASSWORD=supersecret
# Application
APP_ENV=development
DEBUG=true
SECRET_KEY=your-secret-keyUtilisation dans compose.yml
services:
app:
image: mon-app
environment:
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
- APP_ENV=${APP_ENV}
env_file:
- .envRéseaux et communication
Communication entre services
Les services peuvent communiquer entre eux en utilisant leurs noms comme hostnames :
# Dans votre application Python
import psycopg2
# Le hostname 'db' correspond au service 'db' du compose.yml
conn = psycopg2.connect(
host="db",
database="myapp",
user="postgres",
password="password"
)Réseaux personnalisés
services:
web:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
backend:
internal: true # Réseau interne uniquementGestion des volumes
Types de volumes dans Compose
services:
app:
volumes:
# Bind mount (développement)
- ./src:/app/src
# Named volume (production)
- app_data:/app/data
# Volume temporaire
- /tmp
# Volume en lecture seule
- ./config:/etc/app:ro
volumes:
app_data:
driver: localProfils pour différents environnements
services:
app:
image: mon-app
db:
image: postgres:15
profiles:
- production
redis:
image: redis:7
profiles:
- production
mailhog:
image: mailhog/mailhog
profiles:
- development
ports:
- "8025:8025"Utilisation :
# Développement (sans db et redis)
docker compose up
# Production
docker compose --profile production up
# Développement avec mailhog
docker compose --profile development upCommandes utiles avancées
Exécuter une commande dans un service
docker compose exec web bash
docker compose exec db psql -U postgres myappScaler des services
docker compose up --scale web=3Voir la configuration finale
docker compose configArrêter un service spécifique
docker compose stop web
docker compose start webRebuild un service spécifique
docker compose build web
docker compose up -d --no-deps webBonnes pratiques
Structure des fichiers
projet/
├── compose.yml
├── compose.override.yml # Surcharges pour le dev
├── compose.prod.yml # Configuration production
├── .env # Variables d'environnement
├── .env.example # Exemple sans secrets
└── services/
├── frontend/
├── backend/
└── nginx/
Multi-environnements
# Développement
docker compose up
# Production
docker compose -f compose.yml -f compose.prod.yml up
# Test
docker compose -f compose.yml -f compose.test.yml upSanté des services
services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sAvantages de Docker Compose
Simplicité : Un seul fichier pour documenter ton architecture
Reproductibilité : Facile à démarrer tout un projet sur n'importe quelle machine
Isolation : Chaque service est isolé mais connecté
Gestion des dépendances : depends_on gère l'ordre de démarrage
Développement : Rechargement à chaud avec les bind mounts
Production : Volumes persistants et configuration robuste
À retenir
- Plus de
version:dans les fichiers compose.yml modernes docker compose(avec espace) au lieu dedocker-compose- services: définit les conteneurs
- volumes: permet la persistance des données
- networks: pour la communication
- depends_on: gère les dépendances
- env_file: pour les variables d'environnement
- Communication entre services par leur nom
- Profils pour différents environnements
Liens vers les autres parties
Vous avez atteint la fin actuelle de ce cours, d'autres parties avancées arriverons prochainement
Tags
#docker #docker-compose #multi-conteneurs #orchestration #yaml #services #microservices