Comment intégrer Docker, Traefik et Portainer en une pile complète ?

Dernière mise à jour: 7 Mars 2026
  • Traefik fait office de proxy inverse dynamique et résout les certificats TLS, tandis que Portainer offre une interface graphique pour la gestion de Docker et Swarm.
  • La combinaison des fichiers traefik.yml, dynamic.yml et docker-compose.yml vous permet de définir des points d'entrée, un middleware de sécurité et un routage HTTP/HTTPS basé sur des étiquettes.
  • Dans les scénarios Docker autonomes ou Swarm, il suffit de joindre les services au réseau proxy et de les étiqueter afin que Traefik puisse les découvrir et les exposer en toute sécurité.
  • L'utilisation de Let's Encrypt, de réseaux dédiés et d'une authentification de base sur le tableau de bord consolide un environnement robuste pour le déploiement de plusieurs applications sur un seul serveur.

Docker Portainer Traefik

Mettre en place une infrastructure moderne avec Docker, Traefik et Portainer est actuellement l'une des solutions les plus simples pour gérer des conteneurs sur un serveur unique et exposer plusieurs services via HTTPS sans se perdre dans les détails de la configuration. L'avantage principal réside dans le fait que Traefik agit comme un proxy inverse dynamique, tandis que Portainer offre une interface web très simple pour gérer Docker et, si vous le souhaitez, Swarm également.

Dans cet article, vous verrez comment Traefik est configuré comme proxy inverse devant Portainer. Dans un scénario Docker « classique » (autonome) et dans un cluster Docker Swarm, comment intégrer TLS (auto-signé ou Let's Encrypt) et quels fichiers de configuration sont impliqués ?traefik.yml, dynamic.yml y docker-compose.yml) et quelques astuces courantes concernant les intergiciels, les réseaux et les problèmes de balisage typiques dans Traefik.

Quels rôles jouent Docker, Traefik et Portainer dans l'architecture ?

Dans ce type de configuration, Docker constitue la couche de base sur laquelle s'exécutent les conteneurs, Traefik fait office de proxy inverse et d'équilibreur de charge qui reçoit toutes les requêtes HTTP/HTTPS sur les ports 80 et 443 et les envoie au conteneur approprié, et Portainer fournit une interface graphique pour la gestion des images, des conteneurs, des volumes, des réseaux et des piles Docker ou Swarm.

L'idée est d'avoir un seul hôte avec Docker où Traefik est situé à la « porte d’entrée ».: écouter aux points d'entrée web (80) y websecure (443), résout les certificats TLS (généralement avec Let's Encrypt) et, grâce à l'intégration avec le fournisseur Docker, découvre automatiquement les services que vous exposez en ajoutant des étiquettes aux conteneurs.

En revanche, Portainer fonctionne comme un simple conteneur, mais exposé via un sous-domaine spécifique, par exemple portainer.tudominio.com, protégé par TLS et, si nécessaire, par un middleware d'authentification supplémentaire en plus de la connexion Portainer. Le tout est orchestré par un docker-compose qui définit Traefik, Portainer et le réseau commun de type proxy.

L'un des principaux avantages de cette approche est qu'elle permet de déployer de nouveaux services simplement en ajoutant des étiquettes à vos conteneurs : Traefik détecte la modification dans Docker, crée des routeurs, des services et des intergiciels à la volée, et en quelques secondes, un nouveau sous-domaine ou une nouvelle route est opérationnel sans avoir à modifier manuellement les fichiers de configuration statiques.

Configuration statique de Traefik : traefik.yml

La configuration statique de Traefik est généralement stockée dans un fichier comme traefik.ymlqui est monté à l'intérieur du conteneur. Il est défini ici. tableau de bord, points d'entrée, fournisseurs et résolveur de certificats Let's Encrypt, entre autres.

Une configuration YAML typique commence par l'activation de l'API et du panneau de contrôle avec quelque chose comme api: dashboard: trueCeci permet d'accéder à l'interface web où vous pouvez visualiser les routeurs, les services et les intergiciels. Ce panneau n'est pas authentifié par défaut ; nous verrons plus tard comment le sécuriser à l'aide d'une authentification de base via la configuration dynamique.

Ensuite, on définit les points d'entrée. Normalement, il y a un point d'entrée web au port 80 et d'autres websecure dans le 443. Dans le web Une redirection automatique est généralement configurée pour websecureafin que tout accès HTTP soit redirigé vers HTTPS :

Un plan type comprendrait une section http.redirections.entryPoint.to: websecure pour forcer cette redirection et centraliser tout le trafic chiffré au niveau du point d'entrée sécurisé.

Pour websecure Il est indiqué que le protocole TLS doit être utilisé et un lien est fourni. certResolver (par exemple letsencrypt) qui sera chargé de gérer automatiquement les certificats. Tout ceci est pris en charge par ACME, qui est le protocole utilisé par Let's Encrypt pour émettre et renouveler les certificats.

Dans le bloc fournisseurs. Le fournisseur Docker est configuré et pointe vers le socket. unix:///var/run/docker.sockavec une option clé : exposedByDefault: falseDe ce fait, Traefik ne publie pas tous les conteneurs par défaut ; seulement ceux qui portent l’étiquette traefik.enable=trueVous pouvez également configurer un fournisseur de fichiers (file) pour charger une configuration dynamique supplémentaire à partir, par exemple, d'un /configurations/dynamic.yml.

Enfin, le fichier statique inclut généralement la section certificatesResolversoù le résolveur ACME est défini : e-mail d’inscription, fichier de stockage (généralement acme.json), type de clé (par exemple EC384) et la méthode de validation (par exemple httpChallenge au point d'entrée webIl est important que Configurer une véritable adresse e-mail Dans cette section, veuillez noter que Let's Encrypt utilise cette information pour les notifications et les renouvellements ; si vous indiquez une valeur factice ou mal formée, vous risquez de rencontrer des erreurs lors du démarrage du conteneur Traefik.

  Qu'est-ce qu'Apache : le moteur invisible qui alimente le Web

Outre cette configuration YAML, il existe des déploiements qui utilisent Format TOML (traefik.toml)Mais la logique est la même : ils sectionnent les certificats de résolution (par exemple [certificatesResolvers.main.acme]), définir les défis (tels que dnsChallenge avec provider = "route53") et ajouter des options TLS par défaut, telles que Obliger minVersion = "VersionTLS13" ou configurer une liste de cipherSuites autorisé.

Architecture Docker Traefik Portainer

Configuration dynamique : intergiciel, TLS et sécurité

La partie dynamique de Traefik se trouve généralement dans un fichier comme dynamic.yml, chargé par le fournisseur de fichiers. Ici, vous définissez intergiciels et options TLS qui peut être modifié sans redémarrer le conteneur Traefik, ce qui est très utile pour ajuster la sécurité à la volée.

Un cas typique consiste à créer un middleware d'en-tête, par exemple. secureHeadersqui ajoute des politiques relatives à HSTS et à l'utilisation obligatoire du protocole HTTPS. En YAML, vous pourriez trouver des paramètres comme sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: true est notre valeur principale. stsSeconds très rapide (par exemple, une année en secondes). Cela renforce la sécurité du trafic côté navigateur.

Un autre middleware courant est celui de l'authentification de base, par exemple. user-auth type basicAuth, où une liste d'utilisateurs est déclarée au format usuario:hashLe hachage est généralement généré avec htpasswd Il est intégré au fichier. Ce middleware est généralement associé au routeur du tableau de bord Traefik et requiert donc, outre l'accès HTTPS, un nom d'utilisateur et un mot de passe.

Dans cette même configuration dynamique, il est courant de voir un bloc tls.options avec un profil par défaut (default) où les chiffrements pris en charge et la version TLS minimale sont définis, par exemple VersionTLS12Dans certains déploiements, plusieurs options sont définies (par exemple, un profil appelé tls12 et d'autres default) d'adapter le niveau de sécurité aux différents services si nécessaire.

Dans les environnements où l'utilisation est souhaitée TLS également en interne Entre Traefik et les services backend (comme Portainer), un problème peut survenir si ces services ne possèdent pas de certificat reconnu par une autorité de certification publique. C'est là que cette option entre en jeu. insecureSkipVerify, qui, configuré sous providers.http.tls Dans les options TLS appropriées, Traefik peut ainsi contourner la validation du certificat côté serveur. Cette fonctionnalité est utile pour les environnements de test ou les certificats auto-signés internes, mais son utilisation doit être prudente car elle assouplit les exigences de vérification.

Un détail pratique : le fichier dynamic.yml Il peut être modifié à la volée.Traefik recharge la configuration dynamique sans nécessiter de redémarrage, ce qui vous permet d'ajouter ou de supprimer des intergiciels, de modifier les en-têtes de sécurité ou de modifier l'authentification de base sans affecter la disponibilité du proxy.

docker-compose avec Traefik et Portainer dans Docker autonome

Dans un scénario Docker minimal, sans Swarm, la chose la plus courante à faire est de lancer Traefik et Portainer avec un seul docker-compose.yml qui définit à la fois des services et un réseau de type pont partagé appelé, par exemple, proxy.

Le service Traefik Elle utilise généralement l'image officielle, par exemple traefik:latest ou une version spécifique comme traefik:v3.4Les ports sont cartographiés. 80 et 443 pour le trafic web et, dans certains cas, le port 8080 pour exposer le panneau de contrôle en interne. De plus, l'option est ajoutée restart: unless-stopped et la sécurité est renforcée par security_opt: - no-new-privileges:true afin de réduire le risque d'élévation de privilèges au sein du conteneur.

Concernant les volumes, Traefik doit monter le socket Docker en lecture seule (/var/run/docker.sock:/var/run/docker.sock:ro) pour découvrir les conteneurs, le fichier statique traefik.yml et le répertoire où la configuration dynamique sera enregistrée (./traefik-data/configurations:/configurationsLe fichier est également monté. acme.jsonC'est ici que Traefik stocke les certificats émis par Let's Encrypt. Ce fichier est créé sur l'hôte et dispose des autorisations nécessaires. 600 afin que seul l'utilisateur autorisé puisse le lire et l'écrire ; si vous laissez la valeur 644, Traefik signale généralement une erreur.

Le secret de la magie de Traefik réside dans… étiquettes de serviceVous y trouverez notamment : traefik.enable=true (afin que le fournisseur Docker expose ce service), traefik.docker.network=proxy (indique le réseau que Traefik doit utiliser pour communiquer avec le conteneur), et un routeur comme traefik.http.routers.traefik-secure, avec des étiquettes qui définissent son point d'entrée (websecure), la règle hôte (par exemple Host(`traefik.tudominio.com`)), le service associé (api@internal) et le middleware d'authentification (user-auth@file).

  Guide complet d'optimisation des serveurs Linux

Service Portier dans le même docker-compose.yml utilise généralement portainer/portainer-ce:latest (ou l'édition Entreprise si vous possédez une licence). Des volumes similaires sont montés : le socket Docker, le dossier de données (./portainer-data:/data) et souvent aussi le /etc/localtime afin qu'il hérite du fuseau horaire de l'hôte.

Les étiquettes de Portainer l'enregistrent auprès de Traefik : traefik.enable=true, traefik.docker.network=proxyun routeur du type traefik.http.routers.portainer-secure avec point d'entrée websecure et une règle d'hôte comme Host(`portainer.tudominio.com`)De plus, le service que Traefik doit utiliser est défini, pointant vers le port interne de Portainer, par exemple avec traefik.http.services.portainer.loadbalancer.server.port=9000.

Avec tout cela en cours, après le lancement docker compose up -d Dans le répertoire de la pile, Traefik télécharge les images et crée le réseau. proxy S'il est déclaré comme externe et expose les deux panneaux dans les sous-domaines configurés, avec HTTPS automatique grâce à Let's EncryptÀ partir de ce moment-là, l'ajout de nouveaux services se résume à cloner votre projet, à ajouter quelques étiquettes Traefik et à le connecter au réseau. proxy.

Scénario Docker Swarm : Portainer et Traefik dans un cluster

Lorsque vous activez Docker Swarm, la situation évolue légèrement, car les services sont déployés sous forme de piles et les réseaux sont généralement basés sur une architecture de superposition. Cependant, la logique sous-jacente de Traefik et Portainer reste très similaire : Traefik continue de jouer le rôle de proxy inverse et de découvreur de services dynamique, et Portainer peut fonctionner en mode autonome ou en mode Portainer + agent pour gérer les nœuds distants au sein du cluster.

Dans un déploiement Swarm typique, la pile est créée avant d'être appliquée. deux réseaux superposés Traefik l'utilisera pour acheminer le trafic entre les nœuds. De plus, un volume est créé pour stocker les données Portainer (par exemple). portainer_dataet, si besoin est, un pour acme.json ou le répertoire où Traefik stocke les certificats et la configuration.

El docker-compose.yml (qui se déroule ensuite avec docker stack deploy en utilisant, par exemple, -c portainer.yml) définit généralement deux services : Agent Portainer, qui fonctionne en mode global sur tous les nœuds Linux, et le service Portainer principal (CE ou EE), qui reste normalement en mode répliqué avec la contrainte de ne s'exécuter que sur les gestionnaires.

L'agent Portainer monte le socket Docker et le répertoire du volume (/var/lib/docker/volumes) pour pouvoir inspecter les ressources. Il se connecte au réseau superposé qu'il partagera avec Traefik, par exemple. traefik_publicLe service Portainer principal peut être configuré pour communiquer avec l'agent via TCP (tcp://tasks.agent:9001) et, en fait, dans certains exemples, cette commande est affichée avec --tlsskipverify commenté, pour ignorer la vérification TLS si nécessaire.

Sur la même pile ou une autre, Traefik démarre avec le fournisseur Docker en mode Swarm (swarmMode = true en TOML ou l'option équivalente dans les drapeaux), observant les services étiquetés. Sa configuration comprend un certificatesResolvers.main.acme pour Let's Encrypt, un dnsChallenge avec un fournisseur comme Route53 Si vous souhaitez valider des certificats par DNS, et un bloc de tls.options où, par exemple, il est forcé minVersion = "VersionTLS13" pour le profil par défaut et une liste explicite est définie de cipherSuites pour un profil TLS 1.2.

Les étiquettes de Portainer chez Swarm suivent la même philosophie : traefik.enable=trueun routeur comme traefik.http.routers.portainer avec Host(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (selon la dénomination), et traefik.http.routers.portainer.tls=true pour activer TLS sur ce routeur. De plus, vous pouvez spécifier le résolveur de certificats avec traefik.http.routers.portainer.tls.certresolver=main et le schéma backend si le service communique en interne via HTTPS avec traefik.http.services.portainer.loadbalancer.server.scheme=https.

Dans les journaux de débogage Traefik de Swarm, vous verrez la configuration générée : des routeurs comme api y portainer, services découverts (par exemple portainer en http://10.0.1.12:9000 et un service traefik (pointant vers le port 8080 du tableau de bord), et, en cas de problème avec des étiquettes mal définies, des messages comme "Impossible de définir le nom du service pour le routeur : trop de services"ce qui indique généralement un conflit ou une duplication de services associés à un routeur.

Exemple minimal : whoami, routes et TLS avec Traefik

Avant d'intégrer Portainer à l'équation, il est tout à fait pratique d'essayer Traefik avec un backend très simple, comme sur l'image. traefik/whoamiqui renvoie des informations sur la requête. Cela vous permet de vérifier que Traefik est correctement configuré et que les règles de routage fonctionnent.

Un docker-compose.yml Les services de base peuvent inclure le service traefik avec l'image traefik:v3.4, en montant le socket Docker et en définissant les indicateurs de démarrage comme --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy et le point d'entrée --entryPoints.web.address=:80Les ports 80 et 8080 sont annoncés sur l'hôte, et un réseau est créé. proxy qui utilisera également le conteneur whoami.

Le service whoami Il démarre sur le même réseau et est marqué par traefik.enable=trueEnsuite, un routeur est défini avec l'étiquette traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) et il est indiqué que votre point d'entrée est webSi vous faites une demande avec curl -H "Host: whoami.docker.localhost" http://localhost/Vous verrez une réponse contenant le nom d'hôte, les adresses IP, les en-têtes, etc., ce qui confirme que Traefik effectue un routage correct.

  Erreur 404 introuvable : qu'est-ce que c'est, quelles sont ses causes, son impact sur votre site Web et comment y remédier.

À partir de là, c'est simple. ajouter le routage par cheminsPar exemple, vous pouvez créer un autre service. whoami-api avec la même image, sur le même réseau, et étiquetez-la avec une règle du type Host(`whoami.docker.localhost`) && PathPrefix(`/api`)Ainsi, la racine / aller à whoami original et les demandes à /api les serviront whoami-apiVous pouvez le vérifier en faisant des demandes à / ya /api avec le même hôte.

Pour activer TLS Dans cet environnement local, une option consiste à générer un certificat auto-signé pour le domaine. *.docker.localhost avec opensslVous créez un répertoire certs, vous générez local.key y local.crt, puis vous ajoutez un fichier dynamique (par exemple dynamic/tls.yml) avec la section tls: et les itinéraires certFile y keyFile pointant vers ces fichiers.

Ensuite, vous mettez à jour la définition du service Traefik dans docker-compose.yml pour monter le dossier ./certs et le dossier ./dynamic à l'intérieur du conteneur, vous activez l'API sécurisée avec --api.dashboard=true, vous créez le point d'entrée websecure (--entryPoints.websecure.address=:443) et activez TLS à cet endroit avec --entryPoints.websecure.http.tls=trueVous étiquetez également le routeur du tableau de bord et les routeurs de whoami pour qu'ils utilisent websecure et avoir tls=true.

Une fois en ligne, vous pourrez accéder https://whoami.docker.localhost/ et au panneau Traefik avec un certificat auto-signé, en acceptant l'avertissement de sécurité du navigateur. Cette expérience est très similaire à celle que vous aurez plus tard en production avec Let's Encrypt, mais sans dépendre de serveurs DNS publics.

Meilleures pratiques, déploiement d'applications et résolution des problèmes courants

Un schéma récurrent dans tous ces exemples est le suivant : Traefik simplifie considérablement le déploiement de nouvelles applicationsUne fois que vous avez votre pile de base (Traefik + Portainer + réseau) proxy (+ certificats), l'ajout d'un nouveau service se résume généralement à :

Clonez le projet ou copiez votre docker-compose.yml Pour configurer le serveur, associez un sous-domaine à l'adresse IP de l'hôte à l'aide d'un enregistrement A dans votre DNS (par exemple, app.tudominio.com), puis ajoutez les étiquettes clés au service : traefik.enable=true, traefik.docker.network=proxy et un routeur avec une règle d'hôte pour ce sous-domaine, spécifiant le point d'entrée sécurisé websecure et l' service avec le port interne correct.

De nombreux tutoriels montreraient, par exemple, le déploiement d'une petite application. API rapide Séparé : quatre étiquettes sont ajoutées, garantissant son intégration au réseau proxy dans la section networks de docker-compose.ymlet après avoir fait docker compose up -d L'application apparaît automatiquement sur le tableau de bord Traefik avec TLS activé. Grâce à la détection automatique de Traefik, vous n'avez même pas besoin de modifier ses paramètres statiques.

Pour que tout se déroule sans accroc, il est important de prêter attention à quelques détails : Ne réutilisez pas le même identifiant de routeur Dans différentes applications, vérifiez qu'un seul service est associé à chaque routeur (afin d'éviter l'erreur « trop de services »), utilisez des noms de réseau cohérents (par exemple, proxy sur toutes les piles que vous souhaitez exposer), et, si vous utilisez Let's Encrypt, assurez-vous que le acme.json Elle dispose des autorisations 600 et l'adresse e-mail configurée est valide.

Dans les environnements Swarm, vérifiez également que la configuration de Traefik inclut le fournisseur Docker. swarmMode=true y watch=trueet que les contraintes des services (par exemple node.role == manager (Pour Portainer) ne sont pas incompatibles avec l'emplacement de déploiement de Traefik. Les journaux de débogage sont très détaillés, mais essentiels pour identifier les problèmes de routage ou de TLS.

En combinant Docker, Traefik et Portainer, vous pouvez configurer un environnement d'orchestration léger et complet sur un seul serveur, avec des tableaux de bord graphiques, des certificats automatiques et un flux de déploiement très rapide, où l'ajout, la mise à jour ou la suppression de services se résume à modifier quelques lignes de YAML et à laisser Traefik faire le sale boulot de proxy inverse et de TLS.