Un projet d'apprentissage pratique pour découvrir Docker et les concepts de conteneurisation à travers la création d'une architecture de microservices.
- Vue d'ensemble
- Architecture
- Prérequis
- Installation
- Utilisation
- Tests
- Structure du projet
- Technologies utilisées
- Concepts Docker appris
Ce projet implémente une architecture de microservices complète utilisant Docker et Docker Compose. Il comprend :
- API Gateway - Point d'entrée unique pour toutes les requêtes
- Service Movies (Inventory) - Gestion du catalogue de films
- Service Billing - Traitement des commandes via RabbitMQ
- Bases de données PostgreSQL - Stockage persistant
- RabbitMQ - File de messages asynchrone
- Point d'entrée unique pour toutes les requêtes
- Route les requêtes vers les services appropriés
- Gère l'envoi de messages vers RabbitMQ
- Gestion du catalogue de films
- Base de données PostgreSQL dédiée
- API REST complète (CRUD)
- Traitement asynchrone des commandes
- Consommation des messages RabbitMQ
- Stockage des commandes en base
- File de messages pour le traitement asynchrone
- Interface web disponible sur le port 15672
- Docker (version 20.10+)
- Docker Compose (version 2.0+)
- Git
- Postman (pour les tests)
git clone <votre-repo-url>
cd play-with-containers
Créez un fichier .env
à la racine du projet :
# Database Configuration
INVENTORY_DB_USER=...
INVENTORY_DB_NAME=...
INVENTORY_DB_PASSWORD=...
BILLING_DB_USER=...
BILLING_DB_NAME=...
BILLING_DB_PASSWORD=...
# Application Ports
INVENTORY_APP_PORT=...
BILLING_APP_PORT=...
APIGATEWAY_PORT=..
# RabbitMQ Configuration
RABBITMQ_USER=...
RABBITMQ_PASSWORD=...
RABBITMQ_PORT=...
RABBITMQ_QUEUE=...
# Construire et démarrer tous les services
docker compose up --build
# Ou en arrière-plan
docker compose up --build -d
# Ou voir le dossier Makefile pour les alias ' make '...' '
# Voir les logs de tous les services
docker compose logs 'service_name'
# Voir les services actifs
docker compose ps
# Lister tous les films
GET http://localhost:3000/api/movies
# Créer un nouveau film
POST http://localhost:3000/api/movies
Content-Type: application/json
{
"title": "Inception",
}
### Récupérer un film par ID
GET http://localhost:3000/api/movies/{id}
### Mettre à jour un film
PUT http://localhost:3000/api/movies/{id}
### Supprimer un film
DELETE http://localhost:3000/api/movies/{id}
# Créer une commande (envoyée via RabbitMQ)
POST http://localhost:3000/api/billing/
Content-Type: application/json
{
"movie_id": 1,
"quantity": 2,
"customer_email": "client@example.com",
"price": 15.99
}
Accédez à l'interface web RabbitMQ :
- URL : http://localhost:15672
- Username :
admin
(ou valeur deRABBITMQ_USER
) - Password :
admin123
(ou valeur deRABBITMQ_PASSWORD
)
- Importer la collection (si disponible) ou créer les requêtes manuellement
- Tester le service Movies :
GET http://localhost:3000/api/movies
- Tester le service Billing :
POST http://localhost:3000/api/billing/
# Tester la connectivité des services
curl http://localhost:3000/api/movies
curl -X POST http://localhost:3000/api/billing/ \
-H "Content-Type: application/json" \
-d '{"movie_id":1,"quantity":1,"customer_email":"test@test.com","price":10.99}'
# Logs en temps réel de tous les services
docker compose logs -f
# Logs spécifiques
docker compose logs -f api-gateway
docker compose logs -f billing-app
docker compose logs -f rabbit-queue
- Docker & Docker Compose - Conteneurisation et orchestration
- Python Flask - Framework web pour les API
- PostgreSQL - Base de données relationnelle
- RabbitMQ - Message broker pour le traitement asynchrone
- Alpine Linux - Image de base légère pour les conteneurs
- Nginx (optionnel) - Reverse proxy et load balancer
- Création et gestion de conteneurs Docker
- Isolation des processus et des ressources
- Communication inter-conteneurs
- Construction d'images personnalisées avec Dockerfile
- Optimisation des layers pour réduire la taille
- Utilisation d'images de base légères (Alpine)
- Création de réseaux personnalisés
- Communication entre services par nom de conteneur
- Isolation réseau
- Persistance des données
- Partage de données entre conteneurs
- Séparation des données et de l'application
- Orchestration multi-conteneurs
- Définition de services, réseaux et volumes
- Gestion des dépendances entre services
- Variables d'environnement et fichiers .env
# Démarrer les services
docker compose up -d
# Reconstruire les images
docker compose up --build
# Arrêter les services
docker compose down
# Voir les logs
docker compose logs -f [service_name]
# Entrer dans un conteneur
docker compose exec [service_name] sh
# Voir l'état des services
docker compose ps
# Supprimer tout (conteneurs, réseaux, volumes)
docker compose down -v --remove-orphans
-
Erreur de connexion RabbitMQ
# Vérifier les logs RabbitMQ docker compose logs rabbit-queue # Redémarrer le service docker compose restart rabbit-queue
-
Base de données non accessible
# Vérifier le healthcheck docker compose ps # Vérifier les logs de la DB docker compose logs inventory-db
-
Port déjà utilisé
# Modifier les ports dans le fichier .env # Ou arrêter les services qui utilisent le port
- Sécurité : Ne commitez jamais le fichier
.env
contenant vos mots de passe - Performance : Les conteneurs utilisent des images optimisées (Alpine)
- Monitoring : Surveillez les logs pour identifier les problèmes
- Scalabilité : L'architecture permet facilement l'ajout de nouveaux services
Use your crud-master services for the solution of this project.
If you complete the mandatory part successfully, and you still have free time, you can implement anything that you feel deserves to be a bonus.
Challenge yourself!
Does the README.md file contain all the required information to run and manage the solution (prerequisites, configuration, setup, usage, etc)?
What are containers and what are their advantages?
What is the difference between containers and virtual machines?
What is Docker and what is it used for?
What is a microservices' architecture?
Why do we use microservices architecture?
What is a queue and what is it used for?
What is RabbitMQ?
What is a Dockerfile?
Explain the instructions used on the Dockerfile.