1. Préparation de l'application Python
Assurez-vous que votre application dispose d'une structure de projet de base :
mon-application-python/
├── main.py # Point d'entrée principal
├── dependencies.txt # Fichier des dépendances
└── Dockerfile # Configuration pour la conteneurisation
2. Rédaction du Dockerfile
# Sélection d'une image Python officielle légère
FROM python:3.9-slim
# Définition du répertoire de travail
WORKDIR /usr/src/app
# Ajout des fichiers de dépendances
COPY dependencies.txt .
# Installation des paquets requis
RUN pip install --no-cache-dir -r dependencies.txt
# Copie du code source de l'application
COPY . .
# Ouverture du port réseau (si nécessaire)
EXPOSE 8080
# Configuration de l'environnement Python
ENV PYTHONUNBUFFERED=1
# Lancement de l'application
CMD ["python", "main.py"]
3. Ficheir de dépnedances (dependencies.txt)
fastapi==0.100.0
uvicorn==0.23.0
pydantic==2.0.0
4. Application exemple (main.py)
# Exemple d'API avec FastAPI
from fastapi import FastAPI
import uvicorn
service = FastAPI()
@service.get("/")
def accueil():
return {"message": "Bonjour depuis le conteneur"}
@service.get("/status")
def verifier_sante():
return {"etat": "actif"}, 200
if __name__ == '__main__':
uvicorn.run(service, host="0.0.0.0", port=8080)
5. Construction de l'image
# Créer l'image avec un tag
docker build -t api-python .
# Spécifier une version
docker build -t api-python:2.1 .
# Construction sans utilisation du cache
docker build --no-cache -t api-python .
6. Lancement du conteneur
# Exécuter en arrière-plan
docker run -d -p 8080:8080 --name service-api api-python
# Lancer en mode interactif (pour le débogage)
docker run -it --rm api-python /bin/sh
# Passer des variables d'environnement
docker run -d -p 8080:8080 -e APP_ENV=prod api-python
7. Recommandations d'optimisation
Construction multi-étapes (réduire la taille de l'image)
# Étape de compilation
FROM python:3.9-slim AS construction
WORKDIR /build
COPY dependencies.txt .
RUN pip install --user --no-cache-dir -r dependencies.txt
# Étape d'exécution
FROM python:3.9-slim
WORKDIR /app
COPY --from=construction /root/.local /root/.local
COPY . .
ENV PATH="/root/.local/bin:${PATH}"
CMD ["python", "main.py"]
Fichier .dockerignore
Créez un fichier .dockerignore avec le contenu suivant :
__pycache__
*.pyc
*.pyo
.git
.env
env/
*.txt
*.md
.dockerignore
8. Configuration avancée pour la production
FROM python:3.9-slim
# Installation des dépendances système
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /opt/app
# Installation des dépendances Python
COPY dependencies.txt .
RUN pip install --no-cache-dir -r dependencies.txt
# Création d'un utilisateur dédié
RUN adduser --disabled-password --gecos "" --uid 1000 appuser
COPY . .
RUN chown -R appuser:appuser /opt/app
USER appuser
# Vérification de santé
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/status')"
EXPOSE 8080
CMD ["python", "main.py"]
9. Commandes Docker essentielles
# Lister les images disponibles
docker image ls
# Voir les conteneurs actifs
docker container ps
# Consulter les journaux d'un conteneur
docker logs service-api
# Arrêter un conteneur
docker container stop service-api
# Supprimer un conteneur
docker container rm service-api
# Effacer une image
docker image rm api-python
# Exporter une image vers un fichier
docker save -o api-python.tar api-python
# Importer une image depuis un fichier
docker load -i api-python.tar
10. Publication sur un regitsre d'images
# Appliquer un tag à l'image
docker tag api-python utilisateur/api-python:latest
# Pousser vers Docker Hub
docker push utilisateur/api-python:latest
# Pousser vers un registre privé
docker tag api-python registre.mondomaine.com/api-python:latest
docker push registre.mondomaine.com/api-python:latest
Points de vigilance
- Évitez d'exécuter l'application en tant que root - créez un utilisateur dédié
- Préférez des tags de version spécifiques sur l'image de base - évitez :latest
- Organisez les couches de l'image - placez les éléments qui changent rarement en premier
- Purgez les caches lors de l'installation - utilisez --no-cache-dir pour minimiser la taille
- Intégrez des vérifications de santé - essentiel pour l'orchestration des conteneurs