Pourquoi Docker est devenu indispensable pour les développeurs Python
Tu as déjà vécu ça : tu bosses sur un projet Python, tout roule chez toi. Tu envoies le code à ton pote (ou pire, sur le serveur de prod), et là ⊠« ModuleNotFoundError », « version Python incorrecte », « dépendance incompatible ». Le fameux « mais ça marche chez moi ! ».
C’est exactement le problĂšme que Docker rĂ©sout. Et si tu dĂ©veloppes en Python, c’est un outil que tu dois absolument maĂźtriser â pas dans 6 mois, maintenant. Dans cet article, je vais te montrer comment containeriser une application Python en 10 minutes chrono, sans jargon inutile.
Docker en une phrase
Docker, c’est un outil qui permet d’embarquer ton application avec tout son environnement (Python, bibliothĂšques, variables d’environnement, etc.) dans un conteneur lĂ©ger et reproductible. Fini les « ça marchait tout Ă l’heure » â si ça tourne dans le conteneur, ça tournera partout.
Un conteneur, c’est un peu comme une machine virtuelle miniature, mais 100 fois plus lĂ©ger. Pas de systĂšme d’exploitation complet Ă installer, pas de gigaoctets de RAM gaspillĂ©s. Juste ce qu’il faut pour faire tourner ton app.
Ătape 1 : CrĂ©er ton projet Python
On va prendre un exemple concret : une API web minimaliste avec FastAPI (tu peux adapter avec Flask, Django, ou n’importe quel framework).
Structure du projet :
mon-app/
âââ app/
â âââ __init__.py
â âââ main.py # L'application FastAPI
â âââ routes.py # Les endpoints
âââ requirements.txt # Les dĂ©pendances
âââ Dockerfile # La recette du conteneur
âââ .dockerignore # Les fichiers Ă exclureUn petit main.py tout simple :
from fastapi import FastAPI
app = FastAPI(title="Mon API Dockerisée")
@app.get("/")
def read_root():
return {"message": "Hello depuis Docker !"}
@app.get("/health")
def health():
return {"status": "ok"}Ătape 2 : Ăcrire le Dockerfile â le cĆur du sujet
Le Dockerfile, c’est la recette de ton conteneur. Voici un template prĂȘt Ă l’emploi pour une app Python :
# 1. On part d'une image Python officielle (léger = bon)
FROM python:3.12-slim
# 2. On définit le répertoire de travail
WORKDIR /app
# 3. On copie d'abord les dépendances (optimisation cache Docker)
COPY requirements.txt .
# 4. On installe les dépendances
RUN pip install --no-cache-dir -r requirements.txt
# 5. On copie le reste du code
COPY . .
# 6. On expose le port
EXPOSE 8000
# 7. Commande de lancement
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]â±ïž Astuce optimisation : On copie requirements.txt AVANT le reste du code. Pourquoi ? Docker met en cache chaque Ă©tape. Tant que requirements.txt ne change pas, Docker rĂ©utilise le cache pour l’installation des dĂ©pendances â gain de temps Ă©norme quand tu modifies ton code sans ajouter de dĂ©pendances.
Ătape 3 : Construire et lancer le conteneur
Place Ă l’action :
# Construction de l'image
docker build -t mon-api-python .
# Lancement du conteneur
docker run -d -p 8000:8000 --name mon-api mon-api-python
# Vérification
curl http://localhost:8000/
# {"message": "Hello depuis Docker !"}Magique, non ? Ton API tourne dans un environnement propre, isolĂ© et reproductible. Tu peux l’arrĂȘter avec docker stop mon-api et la relancer quand tu veux.
Ătape 4 : Docker Compose â le multi-conteneurs facile
Un vrai projet ne tourne jamais seul : il a une base de donnĂ©es, un cache Redis, un worker en arriĂšre-plan⊠C’est lĂ que Docker Compose entre en jeu. Un fichier YAML et tout ton stack dĂ©marre d’un coup :
version: '3.8'
services:
api:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:Un seul docker compose up -d et tout ton environnement est opĂ©rationnel. Base de donnĂ©es PostgreSQL, API Python, rĂ©seau partagĂ© â zĂ©ro configuration manuelle.
Les bonnes pratiques Ă adopter dĂšs maintenant
- Images légÚres : préfÚre
python:3.12-slimĂpython:3.12(300 Mo vs 900 Mo). Pour du dĂ©ploiement,python:3.12-alpineest encore plus petit (~50 Mo). - .dockerignore : exclus
__pycache__/,.git/,.env,venv/â tout ce qui ne sert Ă rien dans le conteneur. - Un processus par conteneur : pas de SSH, pas de cron, pas de background jobs dans ton conteneur API. Chaque service son conteneur.
- Variables d’environnement : ne jamais hardcoder les mots de passe dans le Dockerfile. Utilise un fichier
.envou lesenvironmentde Docker Compose. - Ne pas tourner en root : ajoute un utilisateur non-root dans ton Dockerfile pour plus de sécurité.
Docker en production â ce qui change
Pour le dĂ©veloppement local, docker run suffit. En production, tu auras besoin d’un orchestrateur comme :
- Docker Swarm â le plus simple, intĂ©grĂ© Ă Docker
- Kubernetes (K8s) â le standard industriel, plus complexe mais ultra-puissant
- Platform.sh / Railway / Render â solutions managĂ©es qui dĂ©ploient direct depuis ton git
Mais avant de viser la Lune avec Kubernetes, commence par maĂźtriser le Dockerfile et Docker Compose. 80% des projets n’ont pas besoin de plus.
Conclusion
Docker n’est pas un outil de plus Ă apprendre â c’est le standard du dĂ©veloppement moderne. Que tu travailles en solo, en startup ou dans une grosse boĂźte, savoir containeriser une application Python est une compĂ©tence indispensable sur un CV en 2026.
Récapitulons ce que tu as appris :
- â CrĂ©er un Dockerfile optimisĂ© pour une app Python
- â Construire et lancer un conteneur
- â Orchestrer plusieurs services avec Docker Compose
- â Appliquer les bonnes pratiques (images lĂ©gĂšres, sĂ©curitĂ©, cache)
Et maintenant ?
Le meilleur moyen d’apprendre, c’est de pratiquer. Prends un de tes projets Python, ajoute-lui un Dockerfile, et lance-le en conteneur. La premiĂšre fois, ça te prendra 15 minutes. La dixiĂšme, tu le feras les yeux fermĂ©s en 30 secondes.
Tu veux aller plus loin ? Sur adamcours.fr, on couvre Docker, Kubernetes, le dĂ©ploiement et tout l’Ă©cosystĂšme moderne du dĂ©veloppeur Python. DĂ©couvre nos formations pour passer au niveau supĂ©rieur.