# TP4 Docker Compose - Application de Mèmes ### Objectif Créer une application web de partage de mèmes en utilisant Docker Compose pour orchestrer 3 conteneurs : - Un frontend (nginx) - Un backend (Python/FastAPI) - Une base de données (MongoDB) ### Prérequis - Docker et Docker Compose installés - Un éditeur de code (VS Code recommandé) ### Structure du projet ``` meme-app/ ├── backend/ │ ├── Dockerfile │ ├── requirements.txt │ └── app.py ├── frontend/ │ ├── Dockerfile │ ├── nginx.conf │ └── index.html └── docker-compose.yml ``` ### Étape 1 : Mise en place de la structure ```bash # Créer l'arborescence mkdir meme-app cd meme-app mkdir backend frontend touch docker-compose.yml ``` ### Étape 2 : Backend 1. Créer backend/requirements.txt : ``` fastapi==0.68.0 uvicorn[standard]==0.15.0 python-multipart pymongo==3.12.0 websockets==10.0 ``` 2. Créer backend/app.py : ```python from fastapi import FastAPI from pymongo import MongoClient app = FastAPI() # MongoDB connection client = MongoClient("mongodb://mongodb:27017/") db = client.memes_db @app.get("/memes") def get_memes(): memes = list(db.memes.find({}, {"_id": 0})) return {"memes": memes} @app.post("/memes") def create_meme(title: str, url: str): meme = {"title": title, "url": url} db.memes.insert_one(meme) return {"message": "Meme added successfully"} ``` - Ajout support CORS sur le backend : Dans les imports: ```py from fastapi.middleware.cors import CORSMiddleware # Juste après la déclaration FastAPI() # Ajouter le middleware CORS origins = [ "http://localhost", ] app.add_middleware( CORSMiddleware, allow_origins=origins, # Liste des origines autorisées allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) ``` - Attention nom du service à remplacer dans le back : ```py client = MongoClient("mongodb://mongodb:27017/") ``` Le 2e "mongodb" correspond au nom du service de MongoDB 3. Créer backend/Dockerfile : ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] ``` ### Étape 3 : Frontend 1. Créer frontend/index.html : ```html