Hostinger

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.

Docker → Nginx → 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-slim utilise 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 /app définit le dossier /app comme répertoire de travail à l’intérieur du conteneur. Toutes les commandes suivantes s’exécuteront depuis cet emplacement.

  • COPY app/ /app copie les fichiers de votre dossier local app/ dans le dossier /app du conteneur. Cela inclut le code Python et le fichier requirements.txt.

  • RUN pip install -r requirements.txt installe les dépendances Python listées dans requirements.txt.

  • EXPOSE 5000 indique seulement que le conteneur utilisera le port 5000.

  • 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 fichier app.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 !

Le site internet basé sur Python dans un navigateur

Ça marche ! 👌