Déployer une architecture multi-services pilotant simultanément une base de données SQL (MySQL) et NoSQL (MongoDB) de manière orchestrée et résiliente.
Cette stack orchestre 5 services via un unique docker-compose.yml :
| Service | Type | Image | Rôle |
|---|---|---|---|
| db_mongo | Database | MongoDB personnalisée (non-root) | Base NoSQL pour les articles |
| db_mysql | Database | MySQL 9.6 | Base SQL pour les utilisateurs |
| admin_mongo | Interface | Mongo Express | Gestion visuelle MongoDB |
| admin_mysql | Interface | Adminer | Gestion visuelle MySQL |
| api | Application | FastAPI (Python) | Pont hybride MongoDB ↔ MySQL |
- Politique de restart :
on-failure— redémarrage automatique seulement en cas d'erreur (crash) - Dépendances & Ordre de démarrage :
apidémarre uniquement sidb_mongoETdb_mysqlsont healthyadmin_mongodémarre uniquement sidb_mongoest healthyadmin_mysqldémarre uniquement sidb_mysqlest healthy
mongosh -u "$MONGODB_INITDB_ROOT_USERNAME" \
-p "$MONGODB_INITDB_ROOT_PASSWORD" \
--authenticationDatabase admin \
--quiet --eval "db.getSiblingDB('blog_db').posts.countDocuments()" | \
grep -q -E '^5$' && echo 'SUCCÈS: 5 posts trouvés' || exit 1Valide que la collection posts contient exactement 5 documents
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} \
-h localhost -D ${MYSQL_DATABASE} \
-e "SELECT COUNT(*) FROM utilisateurs" | \
grep -E '^[1-9]' && echo 'SUCCÈS: Table utilisateurs vérifiée' || exit 1Valide que la table utilisateurs est accessible et contient des données
curl -f http://localhost:8000/healthValide que l'API communique avec les deux bases via /health
- Dockerfile API : Python 3.12-slim avec FastAPI, uvicorn, mysql-connector, pymongo
- Dockerfile MongoDB : Image personnalisée non-root, validation de schéma
.dockerignore: Exclut.git,__pycache__,.venv,.env.gitignore: Exclut.venv,__pycache__,.env, volumes Docker
Retourne les articles depuis MongoDB :
{
"posts": [
{"_id": "507f1f77bcf86cd799439011", "titre": "...", "auteur": "...", "vues": ...},
...
],
"count": 5
}Retourne les utilisateurs depuis MySQL :
{
"utilisateurs": [
{"id": 1, "pseudo": "alice", "email": "alice@example.com"},
...
],
"count": 5
}- Volumes nommés :
mongo_dataetmysql_dataassurent la persistance - Pas de mot de passe en dur : Tous les secrets viennent du
.env - Isolation réseau :
- Bases (MongoDB, MySQL) non publiées sur l'hôte → uniquement réseau interne
- Seules interfaces web + API sont exposées (
9081,9080,9000)
tp-docker-compose/
├── docker-compose.yml # Orchestration des 5 services
├── .env # Variables d'environnement (local)
├── .env.example # Template .env pour la documentation
├── .gitignore # Exclusions Git
├── README.md # Ce fichier
│
├── api/
│ ├── Dockerfile # Image FastAPI
│ ├── main.py # Routes hybrides : /posts, /users, /health
│ └── .dockerignore # Exclusions build Docker
│
├── mongo/
│ ├── Dockerfile # Image MongoDB non-root personnalisée
│ ├── db.js # Script d'initialisation MongoDB
│ ├── check-status.sh # Test de connectivité (optionnel)
│ └── .dockerignore # Exclusions build Docker
│
├── sqlfiles/
│ ├── migration-v001.sql # CREATE DATABASE ynov_ci
│ ├── migration-v002.sql # CREATE TABLE utilisateurs
│ └── migration-v003.sql # INSERT 5 utilisateurs
│
└── images/ # Captures d'écran du livrable
├── docker-compose-ps.png # État des services (healthy)
├── api-routes.png # Routes /posts et /users en JSON
└── (autres captures)
- Docker Engine >= 20.10
- Docker Compose >= 1.29
-
Cloner/accéder au projet
cd tp-docker-compose -
Configurer les variables d'environnement
cp .env.example .env # Éditer .env avec vos valeurs -
Lancer la stack
docker compose up -d --build
--build: Reconstruit les images personnalisées (api, mongo)-d: Mode détaché (arrière-plan)
-
Vérifier les services
docker compose ps
Vous devriez voir tous les services avec le statut
(healthy).
docker compose downdocker compose down -vcurl http://localhost:9000/healthcurl http://localhost:9000/postscurl http://localhost:9000/users-
MongoDB Express : http://localhost:9081
- Username :
admin - Password : (voir
.env)
- Username :
-
Adminer : http://localhost:9080
- Serveur :
db_mysql - Utilisateur :
ynov_user - Mot de passe : (voir
.env) - Base :
ynov_ci
- Serveur :
Tous les 5 services en statut (healthy)
Routes disponibles : /posts, /users, /health
Affiche 5 articles depuis la collection MongoDB blog_db.posts avec count = 5
Affiche 5 utilisateurs depuis la table MySQL ynov_ci.utilisateurs avec count = 5
Affiche l'interface de Adminer pour vérifer que cela fonctionne
Affiche la liste de tout les posts existants sur mongodb



