🎓 Projet BAC+3 🐳 DevOps / Conteneurisation 📅 2025

Voting App

Modernisation du déploiement d'une application de vote distribuée polyglotte — conteneurisation de chaque service et orchestration complète avec Docker Compose, sans modification du code applicatif.

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 python:3.11-slim
Dépendances isolées en couche dédiée pour optimiser le cache Docker.
Worker — .NET
Build multi-stage — séparation sdk / runtime
Réduit la taille de l'image finale (pas de SDK en prod).
Result — Node.js
Image node:18
package.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.
GitHub →

Copyright 2026 © SIVANATHAN Narththanan