DevToolBoxGRATUIT
Blog

Aide-mémoire Docker Compose : Services, volumes et réseaux

10 min de lecturepar DevToolBox

Docker Compose permet de définir et exécuter des applications multi-conteneurs avec un seul fichier YAML.

Structure du fichier

Un fichier docker-compose.yml comprend quatre sections principales :

# docker-compose.yml
services:      # Container definitions
  web:
    image: nginx:alpine
  api:
    build: ./api

volumes:       # Persistent storage
  db-data:

networks:      # Custom networks
  frontend:
  backend:

Configuration des services

Image vs Build

services:
  # Use a pre-built image
  db:
    image: postgres:16

  # Build from Dockerfile
  api:
    build: ./api

  # Build with custom options
  web:
    build:
      context: ./frontend
      dockerfile: Dockerfile.prod
      args:
        NODE_ENV: production

Mapping de ports

services:
  web:
    ports:
      - "80:80"         # host:container
      - "443:443"
      - "3000:3000"     # Expose to localhost
      - "127.0.0.1:8080:80"  # Bind to specific interface

Variables d'environnement

services:
  api:
    # Inline environment variables
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432

    # From external file
    env_file:
      - .env
      - .env.production

Politiques de redémarrage

services:
  web:
    restart: "no"             # Default: never restart
  api:
    restart: always           # Always restart
  db:
    restart: unless-stopped   # Restart unless manually stopped
  worker:
    restart: on-failure       # Restart only on failure
    # restart: on-failure:5   # Max 5 retries

Health Checks

services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

Volumes

services:
  db:
    volumes:
      # Bind mount (host path : container path)
      - ./data:/var/lib/postgresql/data

      # Named volume
      - db-data:/var/lib/postgresql/data

      # Read-only mount
      - ./config:/etc/app/config:ro

volumes:
  db-data:           # Named volume declaration
    driver: local

Réseaux

services:
  web:
    networks:
      - frontend
  api:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true    # No external access

Exemples de stacks

Node.js + MongoDB + Redis

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - MONGO_URL=mongodb://mongo:27017/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - mongo
      - redis

  mongo:
    image: mongo:7
    volumes:
      - mongo-data:/data/db
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  mongo-data:

Django + PostgreSQL

services:
  web:
    build: .
    command: gunicorn myapp.wsgi:application --bind 0.0.0.0:8000
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/myapp
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - static:/app/static

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: secret
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  pg-data:
  static:

WordPress + MySQL + phpMyAdmin

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_pass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_pass
      MYSQL_ROOT_PASSWORD: root_secret
    volumes:
      - db-data:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin:latest
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db

volumes:
  wp-content:
  db-data:

Commandes CLI essentielles

CommandeDescription
docker compose up -dStart services in background
docker compose downStop and remove containers
docker compose down -vStop and remove containers + volumes
docker compose logs -fFollow service logs
docker compose logs apiLogs for specific service
docker compose psList running containers
docker compose exec api shShell into running container
docker compose buildBuild/rebuild images
docker compose pullPull latest images
docker compose restart apiRestart specific service
docker compose configValidate and view config
docker compose topShow running processes

Fichiers d'environnement (.env)

Docker Compose lit automatiquement un fichier .env :

# .env file
POSTGRES_VERSION=16
POSTGRES_PASSWORD=my_secret_pass
APP_PORT=3000

# docker-compose.yml
services:
  db:
    image: postgres:${POSTGRES_VERSION}
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  app:
    ports:
      - "${APP_PORT}:3000"

Erreurs courantes

ErreurSolution
Tag `latest` en productionUtiliser des tags de version spécifiques
Secrets dans docker-compose.ymlUtiliser des fichiers .env ou Docker secrets
Pas de volumes nommésLes volumes nommés persistent après down
Politique de redémarrage manquanteAjouter `restart: unless-stopped`
Pas de limites de ressourcesUtiliser `deploy.resources.limits`

FAQ

Différence entre docker-compose et docker compose ?

docker-compose (avec tiret) est l'ancien outil Python. docker compose (espace) est le nouveau plugin Go (V2).

Comment persister les données ?

Utilisez des volumes nommés.

Comment les conteneurs communiquent ?

Ils partagent un réseau par défaut et utilisent les noms de service.

Peut-on l'utiliser en production ?

Oui, mais pour les grands déploiements, considérez Kubernetes.

𝕏 Twitterin LinkedIn
Cet article vous a-t-il aidé ?

Restez informé

Recevez des astuces dev et les nouveaux outils chaque semaine.

Pas de spam. Désabonnez-vous à tout moment.

Essayez ces outils associés

🐳Docker Compose GeneratorYMLYAML Validator & FormatterY{}JSON ↔ YAML Converter

Articles connexes

Exemples de configuration Nginx : Reverse Proxy, SSL et sites statiques

Configurations Nginx prêtes pour la production : reverse proxy, SSL/TLS, fichiers statiques, load balancing.

Validation YAML Docker Compose : 10 erreurs de syntaxe courantes et comment les corriger

Arrêtez de perdre du temps avec les erreurs YAML Docker Compose. Apprenez à identifier et corriger les 10 erreurs les plus courantes.

Generateur Docker Compose -- Construire docker-compose.yml en Ligne

Guide complet pour generer des fichiers docker-compose.yml en ligne. Structure, services, reseaux, volumes, variables d'environnement, health checks, depends_on, profils, fichiers override, patterns courants et bonnes pratiques de production.