Tutoriel Docker Compose : Déployer un Site Web avec Nginx et Python
Dans ce tutoriel, nous allons utiliser un fichier compose.yml de Docker pour lancer un site développé en Python.
Structure du projet
Nous allons commencer par créer tous les dossiers et les fichiers du projet.
Voici l'arborescence finale :
mon_projet/
|-- app/
|-- app.py
|-- requirements.txt
|-- nginx/
|-- default.conf
|-- Dockerfile
|-- compose.yml
Nous allons brièvement expliquer la signification et fonction de chaque fichier.
app.py
Ce fichier contient le code de l’application Python. C’est le point d’entrée du serveur web qui répond aux requêtes.
requirements.txt
Le fichier requirements.txt liste toutes les dépendances Python nécessaires à l’application. Docker les installera automatiquement lors de la construction de l’image.
default.conf
C'est le fichier de configuration Nginx utilisé comme reverse proxy. Il définit comment Nginx redirige les requêtes vers le service Python.
Dockerfile
Le Dockerfile permet de construire l’image Docker de l’application Python.
compose.yml
C'est le fichier le plus important de notre leçon et il orchestre tous les services via Docker Compose (Python, Nginx, etc.). Il définit les conteneurs, les ports, les volumes et leurs dépendances.
Le fichier compose.yml
Pour nous faciliter la vie, nous allons un fichier compose.yml et nous allons commencer à le créer.
services:
app:
build: .
container_name: python_app
nginx:
image: nginx:latest
container_name: nginx_proxy
ports:
- "8777:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
Nous avons deux services, app pour faire tourner notre application Python, et nginx qui sert de reverse proxy pour rediriger les requêtes vers cette application.
Le code Python
Maintenant, dans le fichier app/app.py, nous allons créer un site simple avec le langage Python. Le port 5000 sera utilisé pour exposer notre application afin qu’elle soit accessible depuis Nginx.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello depuis Python + Nginx + Docker Compose !"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Ensuite, nous allons remplir le fichier des dépendances app/requirements.txt.
Il y aura seulement, une seule dépendance flask que nous utilisons dans app/app.py pour créer un site web avec Python.
flask
Configuration de Nginx
Dans notre compose.yml, nous utilisons une configuration spécifique dans le service nginx. C'est pour cette raison que nous avons mappé le fichier default.conf. Nous allons modifier le contenu pour rediriger la requête vers notre application Python.
server {
listen 80;
location / {
proxy_pass http://app:5000;
}
}
Les informations importantes sont app et 5000, car ils correspondent au nom du service Python et au port sur lequel l’application écoute, permettant à Nginx de rediriger correctement les requêtes vers elle.
Dockerfile
Pour cette exercice, nous allons créer une image personnalisée, c'est pour cette raison que nous utilisons un fichier Dockerfile.
FROM python:3.11-slim
WORKDIR /app
COPY app/ /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
Rappelons la signification de chaque ligne.
-
FROM python:3.11-slimutilise l’image officielle Python 3.11 en version “slim”, légère et optimisée. C’est la base sur laquelle notre application sera construite. -
WORKDIR /appdéfinit le dossier/appcomme répertoire de travail à l’intérieur du conteneur. Toutes les commandes suivantes s’exécuteront depuis cet emplacement. -
COPY app/ /appcopie les fichiers de votre dossier localapp/dans le dossier/appdu conteneur. Cela inclut le code Python et le fichierrequirements.txt. -
RUN pip install -r requirements.txtinstalle les dépendances Python listées dansrequirements.txt. -
EXPOSE 5000indique seulement que le conteneur utilisera le port5000. -
CMD ["python", "app.py"]définit la commande qui sera lancée au démarrage du conteneur. Ici, on exécute l’application Python en démarrant le fichierapp.py.
Lancer le site internet Python
Nous sommes prêts et maintenant, il est temps de lancer notre site internet Python.
docker compose up
Ouvrez un navigateur et tapez localhost:8777 !
Ça marche ! 👌
