DevOpsFacile
AccueilParcours de formationCertificationsModulesCheat SheetÀ Propos
DevOpsFacile

Une plateforme d'apprentissage complète pour maîtriser les pratiques DevOps modernes, du débutant à l'expert.

contact@devopsfacile.fr

Formation

  • Parcours de formation
  • Modules

Informations

  • À Propos
  • Conditions d'utilisation
  • Confidentialité
  • Mentions légales

© 2026 DevOps Facile. Tous droits réservés.

Fait avec pour la communauté DevOps

ModulesDocker Compose et optimisation pour la production

Module

Docker Compose, multi-stage builds, optimisation et bonnes pratiques de production.

  • 1h30
  • Avancé
  • 6 exercices
Voir les exercices

Formation 100 % Linux

Tous les modules nécessitent un environnement Linux. Si vous êtes sur Windows, installez d'abord WSL (Windows Subsystem for Linux) avant de continuer.

Docker Compose et optimisation pour la production

🎯 Objectifs

  • Construire des images légères avec les multi-stage builds
  • Orchestrer plusieurs conteneurs avec Docker Compose
  • Optimiser la taille et la sécurité des images
  • Mettre en place des pratiques de production

📋 Prérequis

  • Docker Intermédiaire - Dockerfile, volumes, réseaux
  • Docker et Docker Compose installés

🏗️ Multi-stage Builds

Pourquoi ?

Un build classique inclut les outils de compilation dans l'image finale. Un multi-stage build sépare la phase de build de la phase de production pour obtenir une image minimale.

Exemple : application Node.js

dockerfile
# Étape 1 : Build
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Étape 2 : Production
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]

Comparaison de taille

ApprocheTaille approximative
Build classique (tout inclus)~800 Mo
Multi-stage~150 Mo

💡 Moins de fichiers = surface d'attaque réduite + déploiement plus rapide.


🐙 Docker Compose

Pourquoi ?

Gérer plusieurs conteneurs avec docker run devient vite ingérable. Compose décrit toute l'infrastructure dans un fichier YAML.

Exemple complet

yaml
# docker-compose.yml
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/app
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  pgdata:

Commandes essentielles

bash
docker compose up -d        # Lancer en arrière-plan
docker compose down          # Arrêter et supprimer
docker compose ps            # Lister les services
docker compose logs -f       # Suivre les logs
docker compose build         # Reconstruire les images
docker compose exec web sh   # Shell dans un service
docker compose restart web   # Redémarrer un service

Options utiles

OptionRôleExemple
depends_onOrdre de démarragedepends_on: [db, redis]
restartPolitique de redémarrageunless-stopped, always
buildConstruire depuis un Dockerfilebuild: ./app
env_fileCharger des variables depuis un fichierenv_file: .env
healthcheckVérification de santéVoir section suivante

Variables d'environnement

Inline dans le YAML ou via un fichier .env :

bash
# .env
POSTGRES_USER=user
POSTGRES_PASSWORD=secret
yaml
services:
  db:
    image: postgres:16-alpine
    env_file: .env

⚠️ Ne versionnez jamais le fichier .env dans Git. Ajoutez-le à .gitignore.


🔬 Docker Compose Avancé

Profiles

Activez certains services uniquement quand nécessaire :

yaml
services:
  web:
    build: .
    ports: ["3000:3000"]

  debug:
    image: busybox
    profiles: ["dev"]
    command: sleep infinity
bash
docker compose --profile dev up -d   # Active le service debug

Health checks

yaml
services:
  web:
    build: .
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s

Fichiers override

Docker Compose fusionne automatiquement docker-compose.yml et docker-compose.override.yml :

yaml
# docker-compose.override.yml - surcharges pour le dev
services:
  web:
    volumes:
      - ./src:/app/src
    environment:
      - NODE_ENV=development

💡 Utilisez override pour le dev et le fichier principal pour la production.


⚡ Optimisation des Images

Choisir une image de base minimale

dockerfile
# ❌ Image complète (~900 Mo)
FROM node:20

# ✅ Variante Alpine (~130 Mo)
FROM node:20-alpine

Réduire les couches

dockerfile
# ❌ Plusieurs couches
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*

# ✅ Une seule couche
RUN apt-get update && \
    apt-get install -y curl && \
    rm -rf /var/lib/apt/lists/*

Utiliser .dockerignore

node_modules
.git
*.log
.env

Comparaison de tailles

Image de baseTaille
ubuntu:22.04~77 Mo
debian:bookworm-slim~52 Mo
alpine:3.19~7 Mo
node:20~900 Mo
node:20-slim~200 Mo
node:20-alpine~130 Mo

🔒 Sécurité Docker

Utilisateur non-root

Par défaut, les conteneurs tournent en root. C'est un risque en cas d'évasion :

dockerfile
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Système de fichiers en lecture seule

bash
docker run --read-only --tmpfs /tmp mon-app

Scanner les vulnérabilités

bash
docker scout cves mon-app:latest

Règles essentielles

  • Ne stockez jamais de secrets (mots de passe, clés API) dans une image
  • Utilisez les secrets Docker ou des variables d'environnement injectées au runtime
  • Mettez à jour régulièrement vos images de base
  • Scannez vos images avant chaque déploiement

⚠️ Un conteneur root compromis peut potentiellement accéder au système hôte.


🧹 Nettoyage et Maintenance

Docker accumule des ressources inutilisées. Vérifiez l'espace utilisé :

bash
docker system df

Nettoyage ciblé

bash
docker container prune    # Conteneurs arrêtés
docker image prune         # Images non utilisées
docker volume prune        # Volumes orphelins
docker network prune       # Réseaux inutilisés

Nettoyage global

bash
docker system prune -a --volumes

⚠️ Cette commande supprime tout ce qui n'est pas utilisé par un conteneur actif : images, conteneurs, volumes et réseaux. Vérifiez avant d'exécuter.


📌 Points Clés

  • Les multi-stage builds réduisent drastiquement la taille des images
  • Docker Compose simplifie l'orchestration multi-conteneurs avec un fichier YAML
  • Choisir une image de base minimale (alpine) améliore sécurité et performance
  • Toujours exécuter les conteneurs avec un utilisateur non-root en production
  • Nettoyez régulièrement avec docker system prune

📚 Ressources

  • Docker Compose documentation
  • Multi-stage builds
  • Docker security best practices
  • Docker Scout

🚀 Prochaines étapes

Vous gérez Docker en production. Automatisez maintenant vos déploiements :

  1. Créer son premier pipeline CI/CD avec GitHub Actions - Premiers workflows CI/CD avec GitHub Actions

Exercices Pratiques

6 exercices pour mettre en pratique

01

01 - Créer un docker-compose.yml de base

20 minutesAvancé
02

02 - Gérer les dépendances entre services

20 minutesAvancé
03

03 - Réduire la taille d'une image avec les multi-stage builds

20 minutesAvancé
04

04 - Appliquer les bonnes pratiques de sécurité Docker

20 minutesAvancé
05

05 - Optimiser pour la production avec Docker

35 minutesAvancé
06

08 - Projet Capstone : Stack de production avec Docker Compose et multi-stage builds

1hAvancé
Retour aux modules

Sur cette page

  • 🎯 Objectifs
  • 📋 Prérequis
  • 🏗️ Multi-stage Builds
  • Pourquoi ?
  • Exemple : application Node.js
  • Comparaison de taille
  • 🐙 Docker Compose
  • Pourquoi ?
  • Exemple complet
  • Commandes essentielles
  • Options utiles
  • Variables d'environnement
  • 🔬 Docker Compose Avancé
  • Profiles
  • Health checks
  • Fichiers override
  • ⚡ Optimisation des Images
  • Choisir une image de base minimale
  • Réduire les couches
  • Utiliser .dockerignore
  • Comparaison de tailles
  • 🔒 Sécurité Docker
  • Utilisateur non-root
  • Système de fichiers en lecture seule
  • Scanner les vulnérabilités
  • Règles essentielles
  • 🧹 Nettoyage et Maintenance
  • Nettoyage ciblé
  • Nettoyage global
  • 📌 Points Clés
  • 📚 Ressources
  • 🚀 Prochaines étapes