Table of Contents
Traefik, un proxy dynamique moderne et un équilibreur de charge, automatise ces tâches en s'intégrant directement à Docker. Contrairement aux proxies traditionnelles qui nécessitent des mises à jour manuelles des fichiers de configuration chaque fois qu'un conteneur démarre ou s'arrête, Traefik écoute le démon Docker et se reconfigure en vol. Cet article fournit un guide complet pour déployer des conteneurs Docker avec Traefik, couvrant la configuration, les fonctionnalités avancées, la sécurité et le dépannage.
Qu'est-ce que Traefik?
Traefik est un proxy et un équilibreur de charge open source construit spécifiquement pour les microservices et les architectures conteneurisées. Il prend en charge plusieurs fournisseurs — Docker, Kubernetes, Consul, Amazon ECS, etc. — permettant la découverte automatique de service et le routage dynamique. Lorsqu'un nouveau conteneur est lancé avec les étiquettes appropriées, Traefik le détecte instantanément et met à jour ses règles de routage sans redémarrage ou intervention manuelle. Les principales caractéristiques comprennent:
- Serr SSL/TLS automatique avec gestion automatique des certificats via Let's Encrypt (ACME).
- Support pour micro-logiciels pour limiter les taux, l'authentification, la réécriture des requêtes, et plus encore.
- avec un tableau de bord web et des mesures Prométhée.
- Équilibrage de charge[ dans plusieurs instances de conteneurs.
- Configuration dynamique via un fichier, des étiquettes ou une API.
L'architecture de Traefik sépare points d'entrée[ (ports où le trafic arrive), routeurs[ (règles correspondant aux requêtes entrantes), et services (groupes de conteneurs de moteur).Cette abstraction permet un contrôle fin du flux de trafic tout en conservant la configuration déclarative et durable.
Préalables
Avant de plonger dans l'installation, assurez-vous que vous avez les éléments suivants :
- Un serveur ou une machine locale fonctionnant Docker Engine (version 20.10 ou ultérieure recommandée).
- Connaissance de base des commandes et des concepts de réseautage de Docker.
- Nom de domaine (pour les exemples HTTPS) et possibilité de pointer les enregistrements DNS vers votre serveur.
- Ports 80 et 443 ouverts sur le pare-feu pour le trafic HTTP et HTTPS.
Si vous utilisez un fournisseur de cloud comme AWS ou DigitalOcean, assurez-vous que votre groupe de sécurité autorise le trafic entrant sur ces ports.
Configuration du Docker avec Traefik
Cette section passe par les étapes fondamentales : créer un réseau Docker dédié, lancer le conteneur Traefik avec la configuration appropriée, et vérifier qu'il fonctionne correctement.
Création d'un réseau Docker
Tous les conteneurs — Traefik lui-même et les conteneurs d'application — devraient partager le même réseau Docker pour une communication transparente.
docker network create traefik-net
L'utilisation d'un réseau personnalisé prévient les conflits avec le réseau de pont par défaut et permet aux conteneurs de se résoudre par nom. Traefik utilisera les étiquettes Docker pour découvrir les services, mais la connectivité réseau est nécessaire pour que le trafic atteigne les conteneurs d'application.
Courir le conteneur Traefik
Lancez Traefik avec la commande suivante. Notez que nous montons la socket Docker pour permettre à Traefik d'écouter les événements de conteneurs, les ports map 80 et 443, et de lier un fichier de configuration. Nous découvrons également le tableau de bord sur le port 8080 (pour usage interne seulement).
docker run -d \
--name=traefik \
--network=traefik-net \
-p 80:80 \
-p 443:443 \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/traefik.yml:/traefik.yml \
-v $PWD/acme.json:/acme.json \
traefik:v2.9
Explanation of the options:
- et : Expose les points d'entrée HTTP et HTTPS.
- : Exposer le tableau de bord (le sécuriser plus tard avec l'authentification).
- : Donner accès à l'API Docker. Ceci est nécessaire pour la détection dynamique mais introduit des implications sur la sécurité (discuté plus tard).
- et : Configuration statique du montage de bind et stockage des certificats SSL.
S'assurer que le fichier existe avec les permissions (lisez/écrivez seulement pour root) avant de commencer Traefik:
touch acme.json && chmod 600 acme.json
Configuration du Traefik
La configuration de Traefik est divisée en deux parties : statical configuration (habituellement dans un fichier) et dynamique configuration (des fournisseurs comme les étiquettes Docker). Le fichier statique définit les points d'entrée, les fournisseurs et les paramètres globaux tels que le niveau de l'enregistrement et le tableau de bord en activant.
Configuration statique (traefik.yml)
Créez un fichier dans le même répertoire à partir duquel vous lancez le conteneur. Ci-dessous est un exemple prêt à la production avec les points d'entrée HTTP et HTTPs, la configuration du fournisseur Docker et Let's Encrypt pour SSL.
entryPoints:
web:
address: ":80"
# Redirect HTTP to HTTPS if desired (commented out for initial setup)
# http:
# redirections:
# entryPoint:
# to: web-secure
# scheme: https
web-secure:
address: ":443"
dashboard:
address: ":8080"
providers:
docker:
exposedByDefault: false # Only expose containers with traefik.enable=true
network: traefik-net
api:
dashboard: true
debug: true
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /acme.json
httpChallenge:
entryPoint: web
log:
level: INFO
Points clés:
- Points d'entrée: Définissez les ports nommés. Le point d'entrée utilise le port 80; utilise 443; utilise 8080.
- Providers: Le fournisseur Docker est configuré avec — seuls les conteneurs avec l'étiquette seront acheminés. Cela empêche l'exposition accidentelle des services.
- API & Dashboard[: Activez le tableau de bord pour le débogage. En production, vous devez le sécuriser avec le middleware d'authentification (voir section avancée).
- Certificate resolder: Utilise le protocole ACME de Encrypt avec défi HTTP-01. Remplacer par votre email.
- Niveau de log: Régler à pour un fonctionnement normal; utiliser pendant le dépannage.
Configuration dynamique via les étiquettes Docker
Lorsque Traefik fonctionne avec le fournisseur Docker, il lit les étiquettes de conteneurs en cours d'exécution. Les étiquettes sont des métadonnées attachées à des conteneurs qui définissent les règles de routage, les middlewares, et d'autres paramètres. Par exemple, un simple service web peut avoir des étiquettes comme:
docker run -d \
--name=app1 \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.app1.rule=Host(`app1.example.com`)" \
-l "traefik.http.routers.app1.entrypoints=web-secure" \
-l "traefik.http.routers.app1.tls.certResolver=letsencrypt" \
my-web-image
Les étiquettes sont analysées par Traefik pour construire dynamiquement des routeurs, des services et des intergiciels. Tout changement d'étiquette prend effet immédiatement sans redémarrer Traefik.
Déploiement des conteneurs d'application
Maintenant, nous déployons des conteneurs d'application réels avec des étiquettes qui indiquent à Traefik comment acheminer le trafic. Ci-dessous sont deux modèles communs: un seul service de domaine et un routage basé sur le chemin pour plusieurs services.
Exemple 1: Service Web simple avec HTTPS
Supposons qu'un conteneur a une application web sur le port 80 en interne. Le but est de le servir à . Exécuter:
docker run -d \
--name=myapp \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" \
-l "traefik.http.routers.myapp.entrypoints=web-secure" \
-l "traefik.http.routers.myapp.tls=true" \
-l "traefik.http.routers.myapp.tls.certResolver=letsencrypt" \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
my-web-app-image
Notez que nous spécifions explicitement le port interne () parce que le conteneur peut exposer plusieurs ports. Si le port du conteneur est correct, Traefik peut le détecter automatiquement, mais explicite est plus sûr.
Exemple 2 : Routage par voie pour plusieurs services
Supposons que vous ayez deux microservices — et — tous deux sur le même domaine . Route à conteneur et à .
Pour le service API :
docker run -d \
--name=api \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)" \
-l "traefik.http.routers.api.entrypoints=web-secure" \
-l "traefik.http.routers.api.tls=true" \
-l "traefik.http.routers.api.tls.certResolver=letsencrypt" \
-l "traefik.http.services.api.loadbalancer.server.port=3000" \
api-image
Pour la façade:
docker run -d \
--name=frontend \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.frontend.rule=Host(`app.example.com`) && PathPrefix(`/`)" \
-l "traefik.http.routers.frontend.entrypoints=web-secure" \
-l "traefik.http.routers.frontend.tls=true" \
-l "traefik.http.routers.frontend.tls.certResolver=letsencrypt" \
-l "traefik.http.services.frontend.loadbalancer.server.port=80" \
frontend-image
Traefik évalue les règles par ordre de spécificité; des chemins plus spécifiques (comme ) sont appariés en premier. Cela assure le bon traitement du moteur de recherche pour chaque demande.
Caractéristiques avancées de Traefik
Au-delà du routage de base, Traefik offre des fonctionnalités puissantes qui améliorent la sécurité, la fiabilité et l'observabilité.
Milieux de travail
Les middlewares sont des fonctions qui traitent les requêtes avant qu'elles n'atteignent le moteur. Ils peuvent être enchaînés et réutilisés dans les routeurs.
- BasicAuth: Protégez le tableau de bord ou un environnement de mise en scène.
- RateLimit: Demandes de gaz d'une seule IP.
- En-têtes: Ajouter des en-têtes de sécurité (par exemple, , ).
- RedirectScheme: Force la redirection HTTP vers HTTPS.
- IPWhiteList[: Restreindre l'accès à des plages IP spécifiques.
Exemple : Sécurisez le tableau de bord Traefik avec HTTP Basic Auth. Créez d'abord un fichier :
htpasswd -nB user | tee -a .htpasswd
Ensuite, définissez un intergiciel dans un fichier de configuration dynamique (ou via des étiquettes sur le conteneur Traefik) et référez-le sur le routeur du tableau de bord. Pour plus de simplicité, placez le intergiciel dans un fichier séparé (par exemple ) et chargez-le via le fournisseur de fichiers:
http:
middlewares:
dashboard-auth:
basicAuth:
usersFile: /etc/traefik/.htpasswd
Puis mettre à jour le conteneur Traefik pour monter également et le fichier , et ajouter une section fournisseur de fichiers dans :
providers:
file:
filename: /dynamic.yml
Enfin, marquez le routeur du tableau de bord pour utiliser le middleware (ou définissez le routeur du tableau de bord dans le fournisseur de fichiers).
Équilibre de charge
L'équilibrage de charge est automatique lorsque plusieurs conteneurs partagent le même nom de service. Traefik distribue les demandes entrantes en utilisant un algorithme de la bobine ronde par défaut. Vous pouvez ajuster les poids et la sticosité par l'intermédiaire des étiquettes. Par exemple, répartir le trafic 70/30 entre deux versions d'une application:
docker run -d \
--name=myapp-v1 \
--network=traefik-net \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
-l "traefik.http.routers.myapp.rule=Host(`app.example.com`)" \
-l "traefik.http.routers.myapp.service=myapp" \
myapp:v1
docker run -d \
--name=myapp-v2 \
--network=traefik-net \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
-l "traefik.http.services.myapp.loadbalancer.server.weight=30" \
myapp:v2
Contrôles de santé
Traefik peut surveiller la santé des conteneurs de moteur et arrêter l'acheminement vers des cas malsains. Configurer les contrôles de santé sur le service de balanceur de charge via les étiquettes:
-l "traefik.http.services.myapp.loadbalancer.healthcheck.path=/health"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.interval=10s"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.timeout=3s"
Si un contenant échoue au contrôle de santé, Traefik le retire de la piscine jusqu'à ce qu'il passe à nouveau.
Surveillance avec tableau de bord et métriques
Le tableau de bord (disponible par défaut au port 8080) offre une visibilité en temps réel sur les routeurs, les services, les intergiciels et la santé.
metrics:
prometheus:
addEntryPointsLabels: true
addServicesLabels: true
Ensuite, grattez le paramètre métriques (par défaut ) de Prométhée et visualisez avec Grafana.
Avantages de l'utilisation de Traefik
Traefik rationalise les flux de travail de déploiement de conteneurs de manière que les proxys inverses traditionnels ne correspondent pas :
- Raguage Zero-touch : De nouveaux conteneurs sont automatiquement découverts et acheminés sans redémarrer les fichiers de configuration proxy ou d'édition.
- Intégré SSL: L'intégration encrypte automatise la délivrance et le renouvellement des certificats, réduisant ainsi les erreurs manuelles de frais généraux et d'expiration des certificats.
- Layer 7 routage: Prise en charge du préfixe de chemin, de l'hôte, des en-têtes, des paramètres de requête et des combinaisons de règles complexes.
- Écosystà ̈me de micro-logiciel: Riche ensemble de middlewares incorporés pour la sécurité, la transformation et le throttling.
- Support multi-fournisseur: Utilisez Docker, Kubernetes, Consul, ou même une configuration simple basée sur des fichiers — Traefik s'adapte.
- Observabilité : Le tableau de bord, les journaux et les mesures aident à diagnostiquer rapidement les problèmes de routage.
Ces avantages se traduisent par des cycles de déploiement plus rapides, moins d'erreurs de configuration et une échelle plus facile. Lorsqu'un conteneur est répliqué, Traefik se charge automatiquement en équilibre entre les instances; lorsqu'un conteneur s'écrase, le proxy inverse cesse immédiatement d'envoyer du trafic à lui.
Dépannage de problèmes communs
Même avec l'automatisation de Traefik, des problèmes peuvent survenir. Ci-dessous sont les pièges fréquents et leurs solutions.
- Conteneur ne figurant pas dans les itinéraires: Vérifier que le contenant est attaché au même réseau Docker () et a l'étiquette . Confirmer également ne le bloque pas.
- Certificat SSL non obtenu: Assurez-vous que votre domaine résout l'IP public du serveur. Vérifiez que le port 80 est accessible pour le défi HTTP-01. Si vous utilisez un défi DNS, configurez correctement le fournisseur. Vérifiez les journaux Traefik pour les erreurs ACME.
- Dashboard inaccessible[: Le tableau de bord est servi au port 8080 par défaut. Si vous avez changé le nom ou le port du point d'entrée, ajustez les étiquettes du routeur du tableau de bord. Assurez-vous également que le est réglé en configuration statique.
- Règles de coupure non correspondantes: Traefik évalue les règles dans l'ordre de la chaîne . Si deux routeurs correspondent à la même requête, celle avec la règle la plus spécifique est utilisée. Utilisez pour combiner les conditions.
- 502 Mauvaise passerelle: Cela indique habituellement que Traefik ne peut pas atteindre le conteneur de secours. Assurez-vous que le conteneur écoute sur le port spécifié dans et que le réseau du conteneur permet le trafic de Traefik (les deux doivent être sur le même réseau de recouvrement ou pont).
Commencez toujours par lorsque vous dépannez pour voir les décisions détaillées de routage.
Considérations en matière de sécurité
Le Traefik en marche avec la prise Docker introduit un risque inhérent : si un attaquant prend le contrôle du conteneur Traefik, il peut manipuler le démon Docker.
- Restriction de l'accès à la socket Docker : Utilisez des solutions proxy socket comme pour filtrer les appels d'API.
- Running Traefik en tant qu'utilisateur non-root ayant des capacités limitées (utiliser et laisser tomber ).
- Réseaux isolants: Ne pas connecter Traefik au même réseau que les conteneurs non fiables.
- Établir l'authentification pour le tableau de bord et utiliser HTTPS pour les paramètres d'administration.
- : Gardez Traefik et son image de base à jour.
De plus, configurer les règles de pare-feu pour limiter l'accès au port 8080 uniquement à partir d'IP internes (par exemple, votre VPN).
Comparaison avec d'autres produits de remplacement
Traefik n'est pas le seul mandataire inverse pour Docker; Nginx et HAProxy sont des alternatives populaires. Voici comment Traefik se distingue:
- vs. Nginx: Nginx nécessite une gestion manuelle de fichier de configuration ou des outils comme nginx-proxy. Traefik fournit l'intégration Docker native sans scripts supplémentaires. Nginx dispose d'un support communautaire plus large et est plus léger pour les configurations simples, mais la reconfiguration dynamique de Traefik est supérieure pour les environnements en évolution rapide.
- vs. HAProxy: HAProxy excelle à l'équilibre et aux performances brutes de charge TCP, mais manque de découverte automatique de service intégré et d'intégration Encryptons. Traefik est plus avisé et plus facile à configurer pour HTTP/HTTPS dans un écosystème conteneurisé.
- vs. Caddy: Caddy dispose également d'un HTTPS automatique et d'une configuration simple, mais Traefik offre un support plus riche et un tableau de bord. Caddy est plus simple pour les déploiements à un seul conteneur; Traefik s'adapte mieux aux microservices.
Pour les équipes utilisant Docker Compose ou Kubernetes, l'intégration des fournisseurs de Traefik réduit considérablement le fardeau opérationnel.
Conclusion
Traefik transforme le déploiement de conteneurs Docker en agissant comme un proxy inversé intelligent et autoconfiguré. Sa capacité à découvrir les services automatiquement, gérer les certificats SSL et le trafic de route basé sur les étiquettes élimine de nombreuses étapes manuelles qui ralentissent le développement et les opérations. Cet article a couvert la configuration essentielle : créer un réseau Docker, configurer Traefik avec des paramètres statiques et dynamiques, déployer des conteneurs d'application avec des étiquettes, et tirer parti de fonctionnalités avancées comme les middlewares, l'équilibrage de charge, et les contrôles de santé. Nous avons également abordé les étapes communes de dépannage et les meilleures pratiques de sécurité.