Accueil/Compétences/Docker Compose
Logo Docker Compose

Docker Compose

L'outil qui simplifie la gestion d'applications multi-conteneurs Docker en permettant de définir et d'exécuter tous vos services avec un simple fichier de configuration.

Pour les non-initiés

Qu'est-ce que Docker Compose ?

Imaginez que vous deviez organiser un événement qui nécessite plusieurs services : un traiteur, un DJ, un photographe, etc. Au lieu de coordonner chaque prestataire individuellement, vous pourriez engager un organisateur d'événements qui s'occupe de synchroniser tous ces services selon vos instructions.

Docker Compose joue ce rôle d'organisateur pour vos applications. Il permet de définir et de gérer plusieurs conteneurs Docker (chacun exécutant un service différent) comme une seule application cohérente.

Pourquoi est-ce utile ?

Simplicité

Définissez tous vos services, réseaux et volumes dans un seul fichier, puis démarrez tout votre environnement avec une seule commande.

Reproductibilité

Assurez-vous que tous les membres de l'équipe travaillent avec exactement le même environnement, éliminant le fameux "ça marche sur ma machine".

En résumé, Docker Compose transforme ce qui serait normalement un processus fastidieux de démarrage, connexion et configuration de multiples conteneurs en une seule commande simple. C'est particulièrement utile pour les applications modernes qui utilisent souvent plusieurs services interconnectés.

Pour les développeurs

Fonctionnement technique

Docker Compose est un outil qui permet de définir et d'exécuter des applications Docker multi-conteneurs. Il utilise des fichiers YAML pour configurer les services d'une application, puis avec une seule commande, il crée et démarre tous les services depuis la configuration.

Le fichier docker-compose.yml

Structure de base

Un fichier docker-compose.yml typique contient les sections suivantes:

  • version : La version de la syntaxe de Compose utilisée
  • services : Définition des conteneurs à exécuter
  • volumes : Définition des volumes pour le stockage persistant
  • networks : Configuration des réseaux pour la communication entre conteneurs
docker-compose.yml
version: '3.8' services: # Service pour l'application web webapp: build: context: ./webapp dockerfile: Dockerfile image: my-webapp:latest container_name: webapp restart: unless-stopped ports: - "3000:3000" environment: - NODE_ENV=production - DB_HOST=db - DB_PORT=5432 - DB_NAME=mydatabase - DB_USER=myuser - DB_PASSWORD=mypassword volumes: - webapp_data:/app/data depends_on: - db networks: - app_network # Service pour la base de données db: image: postgres:14-alpine container_name: postgres restart: unless-stopped ports: - "5432:5432" environment: - POSTGRES_DB=mydatabase - POSTGRES_USER=myuser - POSTGRES_PASSWORD=mypassword volumes: - postgres_data:/var/lib/postgresql/data networks: - app_network volumes: webapp_data: driver: local postgres_data: driver: local networks: app_network: driver: bridge

Commandes essentielles

Voici les commandes de base pour travailler avec Docker Compose:

Commandes Docker Compose
# Démarrer les services définis dans docker-compose.yml docker compose up -d # Voir l'état des services docker compose ps # Voir les logs des services docker compose logs # Suivre les logs en temps réel docker compose logs -f # Arrêter les services docker compose stop # Arrêter et supprimer les conteneurs, réseaux et volumes docker compose down # Reconstruire les images et démarrer les services docker compose up -d --build # Exécuter une commande dans un service spécifique docker compose exec webapp npm run migrate # Voir l'utilisation des ressources docker compose top # Mettre à l'échelle un service à plusieurs instances docker compose up -d --scale webapp=3

Configuration multi-environnement

Docker Compose permet d'utiliser plusieurs fichiers pour différents environnements grâce à l'extension et à la surcharge:

Fichiers de surcharge pour différents environnements
# docker-compose.yml (fichier principal) version: '3.8' services: webapp: image: myapp:latest ports: - "3000:3000" environment: - NODE_ENV=production # ... # docker-compose.override.yml (environnement de développement) version: '3.8' services: webapp: build: ./ volumes: - ./:/app - /app/node_modules environment: - NODE_ENV=development - DEBUG=app:* command: npm run dev # ...

Par défaut, Docker Compose charge docker-compose.yml puis docker-compose.override.yml si présent. Vous pouvez spécifier d'autres fichiers avec l'option -f.

Profils

Les profils permettent de démarrer des ensembles spécifiques de services selon les besoins:

Utilisation des profils dans Docker Compose
version: '3.8' services: webapp: image: myapp:latest ports: - "3000:3000" profiles: ["web", "frontend", "dev"] db: image: postgres:14 ports: - "5432:5432" profiles: ["db", "backend", "dev"] redis: image: redis:alpine ports: - "6379:6379" profiles: ["cache", "backend", "dev"] elasticsearch: image: elasticsearch:7 ports: - "9200:9200" profiles: ["search", "optional"] # Démarrer uniquement les services web # docker compose --profile web up -d # Démarrer les services backend # docker compose --profile backend up -d # Démarrer tout l'environnement de développement # docker compose --profile dev up -d

Concepts clés

  • Services : Représentent des conteneurs qui seront exécutés, avec leur configuration spécifique
  • Volumes : Permettent de persister et de partager des données entre les conteneurs ou avec le système hôte
  • Networks : Facilitent la communication isolée et sécurisée entre les services
  • Depends On : Gère l'ordre de démarrage des services en fonction de leurs dépendances
  • Environment : Injecte des variables d'environnement dans les conteneurs
  • Ports : Configure le transfert de ports entre les conteneurs et l'hôte

Fonctionnalités avancées

  • Scaling : Création de plusieurs instances d'un service avec docker compose up --scale service=N
  • Healthchecks : Configurations pour vérifier l'état de santé des services
  • Secrets : Gestion sécurisée des données sensibles
  • Configs : Configuration externe que les services peuvent monter
  • Deploy : Options de déploiement pour les environnements d'orchestration comme Docker Swarm
  • Extension Fields : Permet d'étendre la configuration avec des champs personnalisés

Bonnes pratiques

  • Séparation des fichiers : Utiliser plusieurs fichiers Compose pour différents environnements (dev, staging, prod)
  • Gestion des secrets : Ne jamais stocker de secrets en clair dans les fichiers Compose, utiliser des variables d'environnement ou Docker secrets
  • Nommage explicite : Nommer clairement les conteneurs, volumes et réseaux pour une meilleure maintenance
  • Versions spécifiques : Spécifier des versions précises des images pour garantir la reproductibilité
  • Optimisation des volumes : Utiliser des volumes nommés plutôt que des bind mounts quand c'est possible
  • Documentation : Documenter les services, leurs dépendances et les variables d'environnement requises
Applications concrètes

Cas d'usage

Environnements de développement

Créez un environnement de développement standardisé incluant tous les services nécessaires (web, Icône base de donnéesbase de données, cache, etc.) avec une seule commande, permettant à tous les développeurs de travailler dans des conditions identiques.

Tests automatisés

Configurez des environnements de test complets avec des bases de données temporaires, des services simulés et des outils de test intégrés comme Icône JestJest ou Icône CypressCypress, facilitant les tests d'intégration fiables et reproductibles.

Déploiement d'applications microservices

Déployez facilement des applications composées de multiples microservices interconnectés, chacun ayant sa propre configuration, mais fonctionnant comme un tout cohérent.

Démonstrations et formations

Créez des environnements de démonstration complets et prêts à l'emploi pour présenter des produits ou former de nouveaux utilisateurs, sans aucune configuration manuelle requise.

Docker Compose vs Alternatives

Voici comment Docker Compose se compare à d'autres solutions d'orchestration:

OutilCas d'usage principalÉchelle
Docker ComposeEnvironnement de développement, applications simplesPetite à moyenne
KubernetesOrchestration d'applications à grande échelle, productionGrande à très grande
Docker SwarmClustering et orchestration simplifiésMoyenne
NomadOrchestration multi-technologie (pas uniquement Docker)Moyenne à grande