Référence Docker Compose - Les commandes les plus utiles avec des exemples
À noter que docker-compose est différent de docker compose...
Voici une cheat sheet Docker Compose avec des exemples annotés pour vous aider à maîtriser rapidement les fichiers et commandes Compose.
Ce guide fait partie de Outils de développement : Le guide complet des workflows de développement modernes.
Prérequis
Le moteur Docker doit être installé avant d’utiliser Compose. Sur Ubuntu, suivez Installer Docker sur Ubuntu pour choisir la bonne méthode d’installation et configurer le plugin docker compose.

Référence du fichier Compose : docker-compose.yml
Structure principale :
version: '3' # Version du format du fichier Compose
services:
web:
image: nginx:latest
ports:
- "8080:80" # Port hôte 8080 : Port conteneur 80
db:
image: postgres
environment: # Variables d'environnement
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Réseau personnalisé
appnet:
driver: bridge
volumes: # Volume nommé
db_data:
- services : Chaque conteneur de votre application multi-conteneurs. Dans l’exemple ci-dessus, nous avons deux services :
webetdb. Pour les opérations sur les conteneurs individuels, consultez la Cheat sheet Docker. - networks & volumes : Définissent des réseaux isolés et un stockage persistant - nous avons ici le réseau
appnetet le volumedb_data.
Exemples
Service unique avec mappage de ports
services:
app:
build: .
ports:
- "8000:80" # Port hôte 8000 : Port conteneur 80
Expose l’application sur le port 8000 de l’hôte et construit à partir du Dockerfile dans le répertoire courant.
Multi-services avec volume partagé et réseau personnalisé
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
Web et DB sur le même réseau ; DB utilise un volume nommé persistant - db_data.
Utilisation du contexte de build et du chemin du Dockerfile
Vous pouvez construire une image Docker à la demande à partir du Dockerfile spécifié dans docker-compose.yml.
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
Partage de données entre services
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
Les deux services accèdent au même volume (pour les fichiers statiques ou les échanges de données) - shared_data.
Options avancées des fichiers Compose
- environment : Définir les variables ENV pour les conteneurs.
- depends_on : Contrôler l’ordre de démarrage des services.
- deploy.replicas : Mettre à l’échelle le service en mode Swarm.
Exemple :
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
Démarrage de 3 instances web ; contrôle uniquement l’ordre de démarrage (pas l’état de préparation).
Commandes essentielles Docker Compose
| Commande | Description | Exemple d’utilisation |
|---|---|---|
docker-compose up |
Crée et démarre les conteneurs | docker-compose up |
docker-compose up -d |
Exécuter en arrière-plan | docker-compose up -d |
docker-compose exec |
Exécuter une commande dans un conteneur en cours d’exécution | docker-compose exec web bash |
docker-compose build |
Construire/reconstruire les images | docker-compose build |
docker-compose down |
Arrêter et supprimer les conteneurs, réseaux, volumes et images | docker-compose down |
docker-compose logs -f |
Voir et suivre les journaux | docker-compose logs -f |
docker-compose ps |
Lister les conteneurs en cours d’exécution | docker-compose ps |
docker-compose run |
Exécuter des commandes ponctuelles (contourne la commande du fichier Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
Arrêter les conteneurs en cours d’exécution (peut redémarrer avec start) |
docker-compose stop |
docker-compose restart |
Redémarrer les services | docker-compose restart web |
docker-compose pull |
Tirer les images des services | docker-compose pull |
docker-compose rm |
Supprimer les conteneurs de services arrêtés | docker-compose rm web |
docker-compose config |
Valider et afficher le fichier Compose | docker-compose config |
docker-compose up --scale web=3 |
Démarrer plusieurs instances d’un service | docker-compose up --scale web=3 |
Modèles Compose courants
-
Bases de données avec données persistantes
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:Les données de la base de données persistent dans le volume
mysql_dataentre les redémarrages des conteneurs. -
Montage de liaison du code pour le développement
services: app: build: . volumes: - .:/appÉdition en direct du code sur l’hôte, automatiquement reflétée dans le conteneur.
Drapeaux utiles
-d: Mode détaché (exécution en arrière-plan).--build: Forcer la reconstruction des images avant le démarrage.--force-recreate: Recréer les conteneurs même s’ils n’ont pas changé.--remove-orphans: Supprimer les conteneurs non définis dans le fichier Compose.
Définition et personnalisation des services
Vous pouvez définir et personnaliser les services, réseaux et volumes dans Docker Compose en utilisant le fichier docker-compose.yml, qui centralise toute la configuration et les besoins d’orchestration de votre application.
- Services sont définis sous la clé
services. - Chaque service représente une configuration de conteneur, où vous pouvez définir :
- Image : Sélectionner une image depuis Docker Hub ou un autre registre.
- Ports : Mapper les ports du conteneur aux ports de l’hôte.
- Variables d’environnement : Transmettre des valeurs de configuration.
- Volumes : Persister des données ou partager des fichiers/dossiers avec l’hôte ou d’autres services.
- Réseaux : Contrôler les réseaux auxquels le service peut accéder.
Exemple :
services:
web:
image: nginx:latest
ports:
- "8080:80" # Port hôte 8080 : Port conteneur 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- Ici, le service
webutilise l’image nginx, définit une variable d’environnement, attache un volume, ouvre le port 80 en 8080 sur l’hôte et se connecte au réseaufrontend. Le servicedbfait quelque chose de similaire pour PostgreSQL.
Personnalisation des réseaux
- Réseaux contrôlent quels services peuvent communiquer. Compose crée un réseau par défaut, mais vous pouvez en définir d’autres, spécifier des pilotes personnalisés, définir des options et déterminer quel service rejoint quel réseau pour une isolation fine.
- Définissez les réseaux au niveau supérieur sous
networks, et listez les réseaux auxquels un service doit se connecter avec la clénetworksau niveau du service.
Exemple :
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- Attacher les réseaux aux services :
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- Cette configuration permet au service
appd’accéder aux utilisateurs sur les réseauxfrontendetbackend, tandis quedbn’est accessible que dans lebackend.
Personnalisation des volumes
- Volumes sont définis sous la clé de niveau supérieur
volumes. Montez-les dans les conteneurs en utilisant la clévolumessous un service. - Les volumes peuvent être nommés, utiliser des pilotes personnalisés et être partagés entre plusieurs services pour la persistance et le partage de données.
Exemple :
volumes:
web_data: # Volume nommé pour le contenu web
db_data: # Volume nommé pour la base de données
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- Dans cet exemple,
web_dataest persisté et disponible pour tout conteneur qui le monte.db_datagarantit que les données de la base de données ne sont jamais perdues lors de la recréation du conteneur. - Vous pouvez définir des montages de liaison avec des options de pilote personnalisées pour des cas avancés :
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Cette configuration met en place un montage de liaison depuis le chemin de l’hôte
/data/db_datavers le conteneur.
Résumé des meilleures pratiques :
- Utilisez le nom du service comme nom d’hôte DNS pour la communication inter-services.
- Attachez les services à plusieurs réseaux selon les besoins pour contrôler l’accès.
- Utilisez des volumes nommés pour le stockage persistant et le partage de données.
- Définissez tout en utilisant YAML, permettant le contrôle de version et des scripts de déploiement faciles.
- Pour la gestion et la visualisation des conteneurs, envisagez Installer Portainer sur Linux.
Fichiers Compose multiples
Pour organiser des configurations complexes multi-services dans Docker Compose, vous pouvez utiliser plusieurs fichiers Compose et des fichiers de substitution, permettant des configurations modulaires, spécifiques à l’environnement et évolutives. Voici comment cela fonctionne :
- Structure des fichiers de base et de substitution
- Créer un fichier de base (
compose.yamloudocker-compose.yml) contenant toutes les définitions de services communes et par défaut. - Ajouter des fichiers de substitution spécifiques à l’environnement (par exemple,
docker-compose.override.yml,docker-compose.dev.yml,docker-compose.prod.yml).
Exemple de structure de fichiers :
/répertoire-projet
|-- docker-compose.yml # Configuration de base
|-- docker-compose.override.yml # Substitutions locales/dev (appliquées automatiquement)
|-- docker-compose.prod.yml # Substitutions de production
|-- docker-compose.test.yml # Substitutions de test (si nécessaire)
La configuration de base définit les services principaux, tandis que chaque substitution personnalise les paramètres pour un environnement ou un cas spécifique.
- Comment fonctionnent les substitutions de fichiers
- Fusion : Lorsque vous exécutez
docker compose up, Docker Compose fusionne la base avec toutes les substitutions dans l’ordre ; les fichiers ultérieurs substituent, étendent ou ajoutent aux paramètres des fichiers précédents. - Substitution des champs : Si un service ou un champ est défini dans plusieurs fichiers, la valeur du fichier spécifié en dernier est utilisée. Les nouveaux champs sont ajoutés.
Exemple de fusion :
docker-compose.yml:services: web: image: myapp ports: - "8000:80"docker-compose.override.yml:services: web: environment: - DEBUG=true- Résultat : Le service
webutilise à la fois l’image et le port de base ainsi que la variable d’environnementDEBUGsubstituée.
- Utilisation des commandes pour plusieurs fichiers
- Comportement par défaut : Si présents, Docker Compose charge automatiquement
docker-compose.override.ymlavecdocker-compose.ymllorsque vous exécutez une commande. - Spécification manuelle des fichiers : Utilisez les drapeaux
-fpour contrôler quels fichiers sont fusionnés et dans quel ordre :docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- Cela ignore la substitution par défaut et utilise les paramètres spécifiques à la production.
- Stratégies d’organisation pratiques
- Séparation des environnements : Utilisez une substitution par environnement : dev, test, prod, etc.
- Microservices et équipes : Divisez la configuration en fichiers séparés pour différents services ou équipes, et combinez-les selon les besoins.
- Bascules de fonctionnalités : Des fichiers supplémentaires peuvent introduire ou supprimer des services ou des configurations optionnels pour des besoins temporaires (par exemple, un
compose.debug.ymlpour une journalisation supplémentaire).
- Avantages
- Clarté : Garde les fichiers individuels petits et ciblés.
- Évolutivité : Ajoutez facilement de nouveaux services, environnements ou paramètres.
- Maintenabilité : Modifiez ou révisez uniquement les sections pertinentes pour un déploiement donné.
- Exemple : Changement d’environnements
Développement :
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Production :
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Chaque environnement ne reçoit que la configuration nécessaire, avec toute la configuration partagée dans le fichier de base.
L’organisation des configurations Compose complexes avec plusieurs fichiers - et l’exploitation du système de substitution/fusion - assure la modularité, la personnalisation spécifique à l’environnement et une évolutivité facile pour les grandes applications Docker multi-services.
Pour le déploiement en production sur un seul hôte Linux — démarrage au lancement, arrêt propre, mises à jour et rotation des journaux — consultez Exécuter Docker Compose comme service Linux avec systemd.