60"
:style="scrolled ? 'background-color:#252426;box-shadow:0 2px 20px rgba(0,0,0,0.4);padding-top:0.5rem;padding-bottom:0.5rem;' : 'background-color:#252426;padding-top:0.75rem;padding-bottom:0.75rem;'">
5
services Docker
3
Dockerfiles rédigés
3
langages (Python · .NET · Node)
1
commande pour tout lancer
Contexte & objectif
Projet réalisé en BAC+3 — j'ai reçu une application de vote distribuée composée de plusieurs modules développés dans des langages différents (Python, .NET, Node.js). L'objectif était de moderniser son déploiement en conteneurisant chaque service et en orchestrant l'ensemble avec Docker Compose, sans modifier le code applicatif.
Flux de données
Vote (Flask)
→
Redis (queue)
→
Worker (.NET)
→
PostgreSQL
→
Result (Node.js + Socket.IO)
5 services orchestrés
vote :8080
Interface de vote — Python / Flask
worker — interne
Traitement asynchrone — .NET Core
result :8081
Affichage temps réel — Node.js
redis :6379
File de messages — image officielle
db :5432
Base de données — PostgreSQL
Rédaction des Dockerfiles
Vote — Python
Image
Dépendances isolées en couche dédiée pour optimiser le cache Docker.
python:3.11-slimDépendances isolées en couche dédiée pour optimiser le cache Docker.
Worker — .NET
Build multi-stage — séparation
Réduit la taille de l'image finale (pas de SDK en prod).
sdk / runtimeRéduit la taille de l'image finale (pas de SDK en prod).
Result — Node.js
Image
node:18package.json copié avant le code source pour exploiter le cache des layers.
Ce que j'ai mis en place
Orchestration Docker Compose
Fichier
docker-compose.yml gérant les 5 services avec leurs dépendances, ports et volumes.Health checks & ordre de démarrage
Health checks sur Redis et PostgreSQL. Le Worker démarre uniquement quand les deux services sont
service_healthy.Persistance des données
Volumes nommés
postgres_data et redis_data — les données survivent aux redémarrages des conteneurs.Isolation réseau
Communication via le réseau
default automatique de Docker Compose (DNS par nom de service — redis, db, etc.). Seuls les ports 8080 et 8081 sont exposés à l'hôte.Stack technique
Conteneurisation
DockerDocker ComposeBuild multi-stage
Services applicatifs
Python / Flask.NET CoreNode.js
Infrastructure
RedisPostgreSQL
Bonnes pratiques
Health checksVolumes nommésRéseau interne
Points techniques notables
Ordre de démarrage avec depends_on & healthcheck
Le Worker ne peut pas démarrer si Redis ou PostgreSQL ne sont pas prêts. Health checks configurés sur les deux services critiques, le Worker attend la condition
service_healthy pour éviter toute erreur de connexion au lancement.
Build multi-stage pour le Worker .NET
Séparation de l'étape de compilation (
sdk) et de l'image finale (runtime). Le SDK .NET n'est pas embarqué en production, ce qui réduit drastiquement la taille de l'image finale.
Optimisation du cache des layers Docker
Dans les Dockerfiles Python et Node.js, les fichiers de dépendances (
requirements.txt, package.json) sont copiés avant le code source pour que Docker réutilise le layer des dépendances à chaque rebuild tant qu'elles n'ont pas changé.
Une seule commande pour tout démarrer
docker compose up suffit à construire les images, démarrer les 5 services dans le bon ordre, créer les réseaux et les volumes. Aucune installation manuelle, environnement identique en dev et en prod.
Voir le code source
Dockerfiles et docker-compose.yml disponibles sur GitHub.