Proxy inverse Traefik pour services Docker : configuration de production pragmatique
Quand plusieurs services Docker tournent sur un même hôte, la gestion des ports devient vite complexe. Traefik résout ce problème en jouant le rôle de proxy inverse dynamique : il découvre les conteneurs via labels et met à jour le routage automatiquement.
Ce guide propose une base solide pour la production, avec TLS automatique, routage propre par domaine et stratégie sécurisée pour le dashboard.
Vue d’ensemble de l’architecture
Une architecture classique comprend :
- Un point d’entrée externe sur 80/443
- Un réseau Docker interne partagé entre Traefik et les applications
- Des labels par service pour hostnames, middlewares et ports internes
- Un resolver ACME pour HTTPS automatique
Traefik écoute les événements Docker et adapte les routes sans rechargement manuel, ce qui réduit fortement l’effort opérationnel.
1) Créer le réseau partagé
docker network create edge
Utilisez ce réseau pour Traefik et tous les conteneurs à publier.
2) Déployer Traefik avec Docker Compose
Exemple docker-compose.yml :
services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge=true
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
- --api.dashboard=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- edge
networks:
edge:
external: true
Créez le fichier ACME avec des permissions strictes :
mkdir -p letsencrypt
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json
3) Router une application via labels
Exemple de service applicatif :
services:
app:
image: ghcr.io/example/myapp:latest
restart: unless-stopped
networks:
- edge
labels:
- traefik.enable=true
- traefik.http.routers.myapp.rule=Host(`app.example.com`)
- traefik.http.routers.myapp.entrypoints=websecure
- traefik.http.routers.myapp.tls.certresolver=letsencrypt
- traefik.http.services.myapp.loadbalancer.server.port=8080
Le DNS de app.example.com doit pointer vers l’IP publique de votre serveur.
4) Sécuriser les endpoints d’exploitation
N’exposez jamais le dashboard sans authentification. Si nécessaire, protégez-le :
labels:
- traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$...
- traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
- traefik.http.routers.traefik.service=api@internal
- traefik.http.routers.traefik.entrypoints=websecure
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
- traefik.http.routers.traefik.middlewares=admin-auth
5) Durcissement production
- Gardez
exposedByDefault=false - Socket Docker en lecture seule
- Règles pare-feu minimales
- Limitation de débit sur endpoints publics
- Headers de sécurité (HSTS, anti-sniff, etc.)
Exemple middleware headers :
- traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000
- traefik.http.middlewares.secure-headers.headers.browserXssFilter=true
- traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true
Attachez ces middlewares à chaque router exposé.
Checklist de validation
docker ps
docker logs traefik --tail=100
curl -I https://app.example.com
Résultat attendu :
- Certificat valide émis
- Réponse
HTTP/2 200(ou code attendu) - Aucun avertissement TLS dans le navigateur
Conclusion
Traefik est un excellent choix pour des environnements Docker où les services évoluent souvent. Avec le routage par labels et TLS automatique, vous réduisez la configuration manuelle et gagnez en fiabilité.
Les gains majeurs viennent d’une segmentation réseau propre, d’un dashboard correctement protégé et de middlewares explicites par application.