Docker Compose : un environnement complet en une commande
Une fois que tu maîtrises les conteneurs seuls, tu veux vite enchaîner plusieurs services :
- base de données,
- API,
- front,
- worker de fond,
- parfois un outil type pgAdmin, RedisInsight, etc.
Lancer tout ça à la main avec docker run, c'est pénible. C'est là que docker-compose devient ton meilleur ami.
Le principe
Tu décris ton environnement dans un fichier docker-compose.yml :
- services (nom, image, ports, volumes, variables d'env),
- réseaux,
- volumes.
Puis tu fais simplement :
docker compose up
docker compose down
Exemple : API + Postgres
Un exemple minimal mais déjà utile :
version: "3.9"
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-net
api:
build: ./api
environment:
DATABASE_URL: postgresql://postgres:secret@db:5432/appdb
ports:
- "8080:3000"
depends_on:
- db
networks:
- app-net
volumes:
db-data:
networks:
app-net:
Avec ça :
dbetapipartagent le réseauapp-net,- la base garde ses données dans
db-data, - l'API est accessible sur
http://localhost:8080.
Commandes de base
# Lancer en mode attaché
docker compose up
# Lancer en arrière-plan
docker compose up -d
# Voir les logs
docker compose logs -f
# Stopper et supprimer les conteneurs (mais pas les volumes)
docker compose down
# Tout supprimer (conteneurs + volumes nommés)
docker compose down -v
Gérer plusieurs fichiers de compose
Tu peux avoir :
- un
docker-compose.ymlgénérique, - un
docker-compose.override.ymlpour le dev (montage de code, outils en plus).
Docker compose fusionne les deux par défaut.
docker compose -f docker-compose.yml -f docker-compose.override.yml up
Exemple de docker-compose.override.yml :
services:
api:
volumes:
- ./api:/app
environment:
DEBUG: "1"
pgadmin:
image: dpage/pgadmin4
ports:
- "8081:80"
environment:
PGADMIN_DEFAULT_EMAIL: "dev@example.com"
PGADMIN_DEFAULT_PASSWORD: "secret"
depends_on:
- db
networks:
- app-net
Bonnes pratiques avec docker-compose
- N'utilise pas
latestpartout : garde des tags d'images explicites. - Regroupe les variables communes dans un
.envque compose peut charger. - Versionne les fichiers compose dans le repo → tout le monde a le même environnement.
- Pour la prod, compose peut être une étape, mais Kubernetes ou un autre orchestrateur prendra souvent le relais.
Transition vers Kubernetes
Le gros avantage de bien structurer tes fichiers docker-compose, c'est que :
- les services correspondent assez naturellement aux Deployments,
- les networks à des Services ou simplement au réseau du cluster,
- les volumes à des PersistentVolumeClaims.
Dans la série Kubernetes, on repartira de ce type de stack pour la migrer proprement vers un cluster.