- Docker Compose v5.1.3 lance 3 conteneurs (API + PostgreSQL + Redis) en une seule commande
docker compose up -d - Installation en 2 commandes sur Ubuntu :
sudo apt-get install docker-compose-pluginpuisdocker compose version - Le fichier
compose.yamldefinit les services, reseaux et volumes — ne jamais mettre de mots de passe en dur, utiliser.env - En production, limitez les ressources CPU/RAM et configurez la rotation des logs pour eviter le plein disque
Introduction
Docker Compose v5.1.3 permet de lancer une stack complete (API, base de donnees, cache) en une seule commande docker compose up -d. Ce guide vous fait construire et deployer une application Node.js + PostgreSQL + Redis en moins de 30 minutes. Version 5.1.3 — Documentation officielle.
Ce que vous allez construire et pourquoi en 2026
Vous allez deployer une application web composee de 3 conteneurs : une API Node.js/Express sur le port 3000, une base PostgreSQL 16 sur le port 5432, et un cache Redis 7 sur le port 6379. Docker Compose orchestre le reseau, les volumes persistants, l'ordre de demarrage et les variables d'environnement — tout depuis un seul fichier compose.yaml. En 2026, Compose V2 est le standard (V1 est abandonne), le format de fichier est passe a la spec Compose v1.0+, et les commandes utilisent le plugin docker compose (sans tiret).
Installation : commandes exactes a copier
Sur Ubuntu/Debian (methode recommandee)
# Ajouter le depot Docker officiel
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin # Verifier
docker compose version
# Docker Compose version v5.1.3 Sur macOS / Windows
# Installer Docker Desktop qui inclut Compose
# macOS : https://docs.docker.com/desktop/setup/install/mac/
# Windows : https://docs.docker.com/desktop/setup/install/windows/ # Verifier apres installation
docker compose version Installation manuelle sur Linux (sans depot)
mkdir -p ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
docker compose version Configuration : fichiers et variables a definir
Creer un repertoire de projet et les fichiers suivants :
# Structure du projet
mon-app/
├── compose.yaml
├── .env
├── app/
│ ├── Dockerfile
│ ├── package.json
│ └── index.js Fichier .env (variables d'environnement)
POSTGRES_USER=appuser
POSTGRES_PASSWORD=Ch4ng3M3!2026
POSTGRES_DB=appdb
DATABASE_URL=postgresql://appuser:Ch4ng3M3!2026@db:5432/appdb
REDIS_URL=redis://cache:6379
NODE_ENV=production
PORT=3000 Fichier compose.yaml
services: api: build: context: ./app dockerfile: Dockerfile ports: - "3000:3000" environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - NODE_ENV=${NODE_ENV} depends_on: db: condition: service_healthy cache: condition: service_started restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 db: image: postgres:16-alpine ports: - "5432:5432" environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5 cache: image: redis:7-alpine ports: - "6379:6379" restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 volumes: pgdata: Le code du projet : construire la fonctionnalite principale
app/package.json
{ "name": "mon-app-api", "version": "1.0.0", "main": "index.js", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.21.0", "pg": "^8.13.0", "ioredis": "^5.4.0" }
} app/Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package.json ./
RUN npm install --omit=dev
COPY .
EXPOSE 3000
CMD ["node", "index.js"] app/index.js — API Express avec PostgreSQL et Redis
const express = require('express');
const { Pool } = require('pg');
const Redis = require('ioredis'); const app = express();
app.use(express.json()); const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const redis = new Redis(process.env.REDIS_URL); // Health check
app.get('/health', (req, res) => res.json({ status: 'ok' })); // Creer une note avec cache
app.post('/notes', async (req, res) => { const { title, content } = req.body; if (!title) return res.status(400).json({ error: 'title requis' }); const result = await pool.query( 'INSERT INTO notes (title, content) VALUES ($1, $2) RETURNING *', [title, content || null] ); await redis.del('notes:all'); res.status(201).json(result.rows[0]);
}); // Lister les notes avec cache Redis
app.get('/notes', async (req, res) => { const cached = await redis.get('notes:all'); if (cached) return res.json(JSON.parse(cached)); const result = await pool.query('SELECT * FROM notes ORDER BY id DESC'); await redis.set('notes:all', JSON.stringify(result.rows), 'EX', 60); res.json(result.rows);
}); // Initialiser la table au demarrage
pool.query(` CREATE TABLE IF NOT EXISTS notes ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT, created_at TIMESTAMPTZ DEFAULT NOW() )
`).then(() => console.log('Table notes prete')); app.listen(process.env.PORT || 3000, () => console.log('API demarree sur le port ' + (process.env.PORT || 3000))); Tester et valider que ca fonctionne
# Lancer tous les conteneurs
docker compose up -d --build # Verifier que les 3 services tournent
docker compose ps
# NAME STATUS PORTS
# mon-app-api-1 Up (healthy) 0.0.0.0:3000->3000/tcp
# mon-app-db-1 Up (healthy) 0.0.0.0:5432->5432/tcp
# mon-app-cache-1 Up (healthy) 0.0.0.0:6379->6379/tcp # Tester l'API
curl http://localhost:3000/health
# {"status":"ok"} # Creer une note
curl -X POST http://localhost:3000/notes -H 'Content-Type: application/json' -d '{"title":"Premiere note","content":"Test Docker Compose"}' # Lister les notes (verifie cache Redis)
curl http://localhost:3000/notes # Voir les logs
docker compose logs -f api # Arreter proprement
docker compose down # Arreter et supprimer les volumes
docker compose down -v Deployer et utiliser en production
Pour la production, ajoutez ces bonnes pratiques :
# 1. Utiliser un fichier compose.prod.yaml pour les overrides
docker compose -f compose.yaml -f compose.prod.yaml up -d # 2. Limiter les ressources par service
services: api: deploy: resources: limits: cpus: '1.0' memory: 512M # 3. Configurer les logs pour eviter le plein disque
services: api: logging: driver: json-file options: max-size: "10m" max-file: "3" # 4. Utiliser des secrets Docker (pas de .env en clair)
echo "Ch4ng3M3!2026" | docker secret create db_password - # 5. Mettre a jour un seul service sans coupure
docker compose up -d --no-deps --build api Aller plus loin : 3 extensions concretes
1. Ajouter un reverse proxy Nginx avec SSL automatique — Utilisez nginx-proxy + letsencrypt companion pour le HTTPS automatise. Ajoutez un service proxy dans votre compose.yaml avec les labels letsencrypt.host sur chaque service web.
2. Ajouter un monitoring avec Prometheus + Grafana — Ajoutez 2 services dans votre compose.yaml : prometheus avec l'image prom/prometheus et grafana avec l'image grafana/grafana. Exposez les metrics Express via prom-client (npm install prom-client) sur /metrics.
3. Configurer un CI/CD avec GitHub Actions — Utilisez docker/build-push-action dans votre workflow YAML pour builder et pousser les images sur Docker Hub ou GitHub Container Registry, puis deployez avec docker compose pull && docker compose up -d sur votre serveur via SSH.
Étapes à suivre5
Installer Docker Engine et le plugin Compose
Commencez par installer Docker Engine et le plugin Compose sur votre serveur Linux. Sur Ubuntu/Debian, ajoutez le depot officiel Docker :curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg, puis ajoutez le depot avececho "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list. Enfin, installez avecsudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin. Sur macOS et Windows, installez Docker Desktop qui inclut Compose nativement. Verifiez avecdocker compose version— vous devez obtenirDocker Compose version v5.1.3ou superieur. Ajoutez votre utilisateur au groupe Docker :sudo usermod -aG docker $USER, puis deconnectez-vous et reconnectez-vous. Si vous etes sur un serveur sans acces au depot Docker, utilisez l'installation manuelle viacurlvers~/.docker/cli-plugins/docker-compose. Attention : l'installation manuelle ne se met pas a jour automatiquement, prenez donc l'installation via paquet quand c'est possible. Configurez egalement le daemon Docker pour le demarrage automatique :sudo systemctl enable docker && sudo systemctl start docker.Creer le fichier compose.yaml avec 3 services
Dans un repertoiremon-app/, creez le fichiercompose.yamlavec 3 services :api(build depuis ./app avec Dockerfile),db(image postgres:16-alpine avec volume persistant pgdata), etcache(image redis:7-alpine). Utilisezdepends_onaveccondition: service_healthypour que l'API attende que PostgreSQL soit pret. Ajoutez deshealthchecksur chaque service :pg_isready -U ${POSTGRES_USER}pour PostgreSQL avec interval 5s et retries 10,redis-cli pingpour Redis, etcurl -f http://localhost:3000/healthpour l'API. Liez les variables d'environnement au fichier.envavec la syntaxe${VARIABLE}— par exemplePOSTGRES_PASSWORD=${DB_PASSWORD}. Exposez les ports : 3000 pour l'API, 5432 pour PostgreSQL, 6379 pour Redis. Definissez unrestart: unless-stoppedsur chaque service pour la resilience. Ajoutez desvolumesnommes pour la persistance :pgdatapour PostgreSQL,redisdatapour Redis. Placez les deux services de donnees dans un reseaubackendet l'API dans les reseauxbackendetfrontendpour isoler les couches. Consultez la reference Compose pour les options detaillees.Ecrire l'application Node.js et le Dockerfile
Dans le sous-repertoireapp/, creezpackage.jsonavec les dependancesexpress,pgetioredis. Le fichierindex.jscree une API REST avec 3 routes :GET /health(verifie que l'API repond et que la connexion DB est active),POST /notes(insere en PostgreSQL avecINSERT INTO notes(title, content) VALUES($1, $2) RETURNING *et invalide le cache Redis avecdel "notes:all"), etGET /notes(lit depuis Redis si disponible viaget "notes:all", sinon depuis PostgreSQL avec mise en cache 60s viasetex). Le Dockerfile utiliseFROM node:20-alpinecomme image de base, definitWORKDIR /app, copiepackage.jsonpuis lanceRUN npm install --omit=devpour les dependances de production uniquement. Copiez le code source avecCOPY ., exposez le port 3000 avecEXPOSE 3000et lancez avecCMD ["node", "index.js"]. La tablenotesest creee automatiquement au demarrage viaCREATE TABLE IF NOT EXISTS notes (id SERIAL PRIMARY KEY, title VARCHAR(255), content TEXT, created_at TIMESTAMP DEFAULT NOW()). Ajoutez un fichier.dockerignoreexcluantnode_modules,.gitet.env. La documentation Dockerfile reference detaille chaque instruction.Demarrer et tester la stack complete
Lancezdocker compose up -d --buildpour construire l'image et demarrer les 3 conteneurs en arriere-plan. Verifiez avecdocker compose psque les 3 services sontUp (healthy)— attendez environ 15 secondes que les healthchecks passent. Si un service resteUnhealthy, consultez les logs avecdocker compose logs dboudocker compose logs api. Testez l'API aveccurl http://localhost:3000/health— vous devez obtenir{"status":"ok"}. Creez une note :curl -X POST http://localhost:3000/notes -H "Content-Type: application/json" -d '{"title":"Test","content":"Mon premier test"}'. Lisez les notes :curl http://localhost:3000/notes. La premiere requete lit PostgreSQL, la suivante lit le cache Redis (verifiez dans les logs avecdocker compose logs api | grep cache). Verifiez les volumes avecdocker volume ls— vous devez voirmon-app_pgdataetmon-app_redisdata. Pour arreter sans supprimer les donnees :docker compose down. Pour effacer les volumes et repartir a zero :docker compose down -v. Pour voir la consommation de ressources :docker stats. La documentation Docker Compose explique les commandes avancees.Securiser et deployer en production
En production, ne mettez jamais de mots de passe dans le fichier.envversionne — utilisez Docker Secrets ou un gestionnaire de secrets comme Vault ou AWS Secrets Manager. Limitez les ressources de chaque service avecdeploy.resources.limits: par exemplecpus: "0.5"etmemory: 512Mpour l'API,cpus: "1.0"etmemory: 1Gpour PostgreSQL. Configurez la rotation des logs aveclogging: driver: json-fileetoptions: {max-size: "10m", max-file: "3"}pour eviter que les logs ne remplissent le disque. Utilisez un fichiercompose.prod.yamlpour les overrides production et lancez avecdocker compose -f compose.yaml -f compose.prod.yaml up -d. Pour mettre a jour un seul service sans couper les autres :docker compose up -d --no-deps --build api. Ajoutez un reverse proxy Nginx avec SSL via Let's Encrypt pour exposer uniquement les ports 80 et 443, et fermez les ports 5432 et 6379 du pare-feu. Configurez egalementread_only: truesur les conteneurs qui n'ecrivent pas sur le filesystem, et ajouteztmpfs: /tmppour les ecritures temporaires. Activezsecurity_opt: no-new-privileges:truepour chaque service afin d'empecher l'escalade de privileges.
Conseils pratiques
- {"title":"Utilisez docker compose watch en developpement","content":"La commande
docker compose watch(disponible depuis Compose v2.22) rebuilder automatiquement votre service quand les fichiers sources changent, sans redemarrer manuellement. Ajoutezwatchdans votre compose.yaml pour les fichiers a surveiller."} - {"title":"Verifiez votre compose.yaml avant de lancer","content":"Utilisez
docker compose configpour valider et afficher la configuration finale apres interpolation des variables. Cette commande detecte les erreurs de syntaxe YAML et les variables manquantes avant le demarrage — gain de temps considerable sur les projets complexes."} - {"title":"Nettoyez les ressources orphelines","content":"Apres avoir modifie votre compose.yaml, lancez
docker compose down --remove-orphanspour supprimer les conteneurs qui ne sont plus definis dans le fichier. Sans cette option, les anciens conteneurs restent en arriere-plan et consomment des ressources."}
Points d'attention
- {"title":"Ne publiez jamais les ports de base de donnees en production","content":"Le port 5432 (PostgreSQL) et 6379 (Redis) ne doivent jamais etre exposes sur Internet. En production, retirez la section
portsdes services db et cache, ou utilisezexposea la place pour limiter l'acces au reseau Docker interne. Une base de donnees exposee est la premiere cible des attaques par force brute."} - {"title":"N'utilisez pas le mot de passe par defaut en production","content":"Le mot de passe
Ch4ng3M3!2026de ce tutoriel est un exemple. En production, generez un mot de passe aleatoire de 32+ caracteres avecopenssl rand -base64 32et stockez-le dans Docker Secrets ou un gestionnaire de secrets. Ne commitez jamais le fichier.envdans Git — ajoutez-le au.gitignore."} - {"title":"Attention a l'ordre de demarrage avec depends_on","content":"
depends_onaveccondition: service_healthyattend que le healthcheck passe, mais il ne garantit pas que PostgreSQL est pret a accepter des requetes. Si votre application plante au demarrage avec une erreur de connexion, ajoutez une logique de retry dans votre code (backoff exponentiel, 5 tentatives, 3s entre chaque) plutot que de compter uniquement sur Compose."}
Questions fréquentes3
Quelle est la différence entre Docker et Docker Compose ?
Docker gère un seul conteneur à la fois. Docker Compose orchestre plusieurs conteneurs ensemble (application, base de données, cache) avec un seul fichier docker-compose.yml et une seule commande docker compose up.
Comment gérer les volumes persistants avec Docker Compose ?
Déclarez les volumes dans la section volumes du docker-compose.yml. Utilisez des volumes nommés pour les données de base de données et des bind mounts pour le développement local.
Comment déployer Docker Compose en production ?
Utilisez docker compose -f docker-compose.prod.yml up -d avec un fichier de production séparé. Ajoutez restart: always, des health checks, et des limites de ressources (memory, CPU) pour chaque service.
Guides Technologie & IA
Voir toutConstruire un chatbot local avec Ollama et Python en 30 minutes
Utiliser DeepSeek V4 en 2026 pour améliorer la recherche
Utiliser Claude Opus 4.7 en 2026 pour améliorer la productivité
Comment créer et gérer ses mots de passe de manière sécurisée en 2026
Reconnaître un deepfake en 2026 — Comment ça marche
Poursuivez votre lecture
Multi-catégories"Impôts du Cœur" : les agents des finances publiques proposent leur aide à la déclaration de revenus sur le marché
Comment refuser un loyer supérieur à 30 % du revenu en 2026 ?
Comment créer et utiliser son identité numérique avec FranceConnect en 2026
Automatiser ses emails avec Python et l'API Gmail en 2026
Utiliser Qwen 3 en local avec Ollama : guide complet 2026
Transmission d'entreprise 2026 : dispositifs fiscaux et étapes clés pour vendre ou céder son affaire
Équipe éditoriale GuidePratiquefr
Rédacteurs spécialisés en droit, fiscalité et finances
Rédigé et vérifié par notre équipe de rédacteurs spécialisés. Sources officielles consultées : service-public.fr, legifrance.gouv.fr, impots.gouv.fr, ameli.fr. Dernière vérification : 14 mai 2026.
Sources officielles consultées
Les informations contenues dans ce guide sont fournies à titre indicatif et ne remplacent pas un conseil professionnel personnalisé.