Intermédiaire55 min40 XP
Objectifs de cette leçon
- Définir une stack multi-conteneurs avec docker-compose.yml
- Gérer les dépendances entre services
- Lancer un environnement complet en une commande
Docker Compose 🎼
Pourquoi Docker Compose ?
Quand une application a plusieurs services (app, BDD, cache…), gérer chaque conteneur séparément est un cauchemar :
# Sans Compose : 4 commandes pour démarrer docker network create app-net docker run -d --name postgres --network app-net -e POSTGRES_PASSWORD=secret postgres:15 docker run -d --name redis --network app-net redis:alpine docker run -d --name app --network app-net -p 3000:3000 mon-app
Avec Docker Compose : un seul fichier docker-compose.yml.
Le fichier docker-compose.yml
version: '3.8' services: # Service 1 : Application Node.js app: build: . ports: - "3000:3000" environment: - DB_HOST=postgres - DB_PORT=5432 - REDIS_HOST=redis depends_on: - postgres - redis networks: - app-network restart: unless-stopped # Service 2 : PostgreSQL postgres: image: postgres:15-alpine environment: POSTGRES_PASSWORD: secret POSTGRES_DB: mabase volumes: - pgdata:/var/lib/postgresql/data networks: - app-network restart: unless-stopped # Service 3 : Redis redis: image: redis:alpine networks: - app-network restart: unless-stopped # Volumes persistants volumes: pgdata: # Réseau dédié networks: app-network: driver: bridge
Commandes Docker Compose
# Démarrer tous les services (arrière-plan) docker compose up -d # Voir les services en cours docker compose ps # Résultat : # NAME IMAGE STATUS PORTS # app mon-app Up 2 minutes 0.0.0.0:3000->3000/tcp # postgres postgres:15-alpine Up 2 minutes 5432/tcp # redis redis:alpine Up 2 minutes 6379/tcp # Voir les logs docker compose logs -f app # Arrêter tous les services docker compose down # Arrêter et supprimer les volumes docker compose down -v # Reconstruire les images docker compose build # Redémarrer un service docker compose restart app # Exécuter une commande dans un service docker compose exec app bash
Les clés essentielles
| Clé | Description | Exemple |
|---|---|---|
services | Définition des services | app:, postgres: |
image | Image à utiliser | image: nginx:alpine |
build | Construire depuis un Dockerfile | build: . |
ports | Mapping des ports | - "3000:3000" |
volumes | Montage de volumes | - pgdata:/data |
environment | Variables d'environnement | - DB_HOST=postgres |
depends_on | Dépendances entre services | - postgres |
networks | Réseau(s) à utiliser | - app-network |
restart | Politique de redémarrage | unless-stopped |
Exemple : Application Laravel + MySQL + Redis
version: '3.8' services: laravel: build: context: . dockerfile: Dockerfile ports: - "8000:80" environment: DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_DATABASE: laravel DB_USERNAME: laravel DB_PASSWORD: secret REDIS_HOST: redis volumes: - ./src:/var/www/html depends_on: - mysql - redis networks: - laravel-network mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootsecret MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: secret volumes: - mysql-data:/var/lib/mysql networks: - laravel-network redis: image: redis:alpine networks: - laravel-network volumes: mysql-data: networks: laravel-network: driver: bridge
Exemple : Application React + Nginx
version: '3.8' services: frontend: build: context: . dockerfile: Dockerfile ports: - "80:80" depends_on: - api api: build: context: ../api dockerfile: Dockerfile ports: - "8000:8000" environment: - DATABASE_URL=postgres://user:pass@db:5432/mydb depends_on: - db db: image: postgres:15-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - pgdata:/var/lib/postgresql/data volumes: pgdata:
Variables d'environnement avec .env
# .env (à la racine du projet) DB_PASSWORD=secret123 APP_PORT=3000
# docker-compose.yml services: app: ports: - "${APP_PORT}:3000" environment: - DB_PASSWORD=${DB_PASSWORD}
Exercices 🎯
- Setup : Créez un
docker-compose.ymlavec Node.js + PostgreSQL. - Lancement : Lancez avec
docker compose up -det vérifiez avecdocker compose ps. - Logs : Voyez les logs de chaque service avec
docker compose logs. - Multi-service : Ajoutez Redis à votre architecture.
Prochaine leçon : Dockeriser une application Node.js.
🔄 Docker ComposeCliquez pour voir les dépendances
docker compose up
Lance tous les services définis dans docker-compose.yml
FrontendNext.js
Port 3000
BackendLaravel API
Port 8000
DatabasePostgreSQL
Port 5432
CacheRedis
Port 6379
1/7