Traefik est un outil open-source, français, permettant d'avoir un edge routeur et un load-balancer HTTP, TCP et UDP. La gestion des certificats SSL est aussi de la partie, que ce soit via Let's Encrypt ou votre autorité de certification personnelle.
An open-source reverse proxy and load balancer for HTTP and TCP-based applications that is easy, dynamic, automatic, fast, full-featured, production proven, provides metrics, and integrates with every major cluster technology...
Version | Date | Commentaires |
---|---|---|
1 | 01/2020 | Création de l'article |
1.1 | 02/2020 | Correction des informations |
1.2 | 05/2022 | Reformatage de l'article, corrections syntaxiques |
1.3 | 08/2022 | Ajout de la rubrique "Pourquoi Traefik" |
1.4 | 05/2023 | Mise à jour des versions, de la syntaxe et ajout du contexte d'exécution |
1.5 | 07/2023 | Suppression du port 8080, suppression des doublons, suppression du réseau docker |
Objectif : Découvrir l'outil Traefik
Environnement : Debian 12
, Docker 24.x
, docker compose (plugin) 2.20.x
, Traefik 2.10
.
Contexte d'exécution :
jho@vmi866042:/opt/docker/dc$ tree
.
├── conf
│ ├── acme.json
│ ├── traefik.yml
│ ├── traefikdynamic
│ │ ├── dynamic.yml
├── docker-compose.yml
└── logs
├── traefikAccess.log
├── traefik.log
- dossier où se trouvent tous les fichiers et dossiers pour cet exemple :
/opt/docker/dc
- emplacement du fichier de configuration principal de Traefik :
/opt/docker/dc/conf/traefik.yml
- dossier où se trouvent les configurations de Traefik (fichiers dynamiques) :
/opt/docker/dc/conf/traefikdynamic
- emplacement du fichier comportant tous les certificats générés par let's encrypt (ou autre) :
/opt/docker/dc/conf/acme.json
- dossier où se trouvent les journaux d'événements (logs) :
/opt/docker/dc/logs/
Pourquoi utiliser Traefik ?
Dans vos infrastructures, vous avez parfois la nécessité de permettre à vos utilisateurs d'accéder à divers services. Avec les besoins grandissant en disponibilité, vous serez amené à avoir plusieurs serveurs devant être accessibles sans action de la part de l'utilisateur. Pour ce faire, un serveur de type « proxy inverse » doit être mis devant ces serveurs d'applications. Ce proxy inverse sera le seul point d'entrée pour vos utilisateurs.
Un proxy inverse permet plusieurs choses :
- répartir la charge entre les machines selon l'action souhaitée,
- effectuer un filtrage en entrée,
- gérer une authentification en entrée, ou transférer la demande (valide) d'authentification vers un autre service,
- garder des pages en mémoire pour les redistribuer plus rapidement à la demande.
En plus des fonctionnalités de proxy inverse, Traefik est aussi un routeur efficace, vous facilitant la configuration grâce à son module de découverte automatique.
Quelques éléments de compréhension
Qu'est-ce que la configuration statique ?
C'est l'ensemble des options utilisées au démarrage de Traefik. Ces options concernent principalement les informations de connexions vers les providers (fournisseurs), les systèmes de tracking et outils de métriques.
Ces options peuvent être définies de 3 façons différentes :
- avec un fichier de configuration principal au format TOML ou YAML (c'est le
traefik.toml
outraefik.yml
) ; - avec des paramètres de ligne de commandes (CLI flags) ;
- avec des variables d'environnement (déconseillé).
Il n'est possible d'utiliser qu'une seule source à la fois (donc soit le fichier, soit la ligne de commandes).
La configuration statique, Quelle que soit sa source (TOML/YAML, CLI flags, ou variables d'environnement) n'est lu qu'une seule fois lors du démarrage de Traefik. Il n'est pas possible de définir le routage (routers, services, middlewares, configuration TLS) dans la configuration statique.
Qu'est-ce que la configuration dynamique ?
C'est l'ensemble des options utilisées pour définir les routers, les services, les middlewares et la configuration TLS.
Cette configuration peut être définie de différentes façons :
- avec un ou des fichiers (provider file) au format TOML ou YAML, sans lien avec le contenu du fichier
traefik.toml
/traefik.yml
; - avec des labels (provider Docker, Rancher, etc) ;
- avec des Ingress ou des CRD propre à Traefik (Kubernetes) ;
- via des données stockées dans un KV store
Toutes ces sources de configuration dynamique peuvent être utilisées en même temps. La configuration dynamique peut être modifiée pendant l’exécution de Traefik sans avoir besoin de redémarrer (grâce à la ligne watch = true
).
Dans le cas de tous les providers (sauf le provider file), cette configuration est automatiquement reconstruite et mise à jour (sans rechargement) dès qu'un changement est détecté (ajout/suppression/modification d'un conteneur ou d'un fichier de configuration).

Fichier docker-compose.yml pour Traefik
L'idée est d'avoir un conteneur capable de rediriger les requêtes en fonction de la demande. Pour ce faire, je vais utiliser le dossier /opt/docker/dc
et y créer les dossiers/fichiers nécessaires.
De plus, j'utilise une configuration dynamique pour configurer mes routeurs et services. Après plusieurs essais, je trouve plus facile l'utilisation des configurations dynamiques qu'une configuration statique avec labels dans le docker-compose.yml. Avec de genre de configuration, plus besoin de redémarrer Traefik et les autres conteneurs pour prendre en compte les modifications.
Étapes préliminaires
Création des dossiers et des fichiers de configuration et y attribuer les droits nécessaires.
sudo mkdir -p /opt/docker/dc/conf/traefikdynamic /opt/docker/dc/logs
sudo touch /opt/docker/dc/conf/acme.json /opt/docker/dc/conf/traefik.yml /opt/docker/dc/logs/traefik.log
sudo chmod 0600 /opt/docker/dc/conf/acme.json
Ci-dessous un exemple de fichier docker-compose.yml pour Traefik, avec son fichier de configuration traefik.yml
(en lecture seule) et le fichier acme.json
pour y stocker les certificats Let's Encrypt (en lecture/écriture).
---
services:
traefik:
image: traefik:saintmarcelin
container_name: traefik
restart: unless-stopped
ports:
- target : 80
published : 80
protocol: tcp
mode : host
### BEGIN dashboad
- target : 8080
published : 8080
protocol: tcp
mode : host
### END dashboard
- target : 443
published : 443
protocol: tcp
mode : host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./conf/traefikdynamic:/dynamic
- ./conf/traefik.yml:/etc/traefik/traefik.yml:ro
- ./conf/acme.json:/etc/traefik/acme.json
- ./logs/traefik.log:/etc/traefik/applog.log
environment:
TZ: Europe/Paris
Le fichier traefik.yml
correspond aux options de démarrage pour Traefik (fichier de configuration statique). Actuellement, je vous propose un fichier relativement simple, permettant 2 points d'entrées (80/TCP & 443/TCP), des logs, se connecter au socket de docker et accéder au tableau de bord web Traefik :
---
global:
sendAnonymousUsage: false
checkNewVersion: false
api:
dashboard: true
log:
filePath: "/etc/traefik/applog.log"
format: json
level: "ERROR"
providers:
docker:
endpoint: unix:///var/run/docker.sock
exposedByDefault: false
watch: true
swarmMode: false
file:
directory: "/dynamic"
watch: true
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
À partir de cet instant, un docker compose up -d
permettra de récupérer la dernière image disponible si vous ne l'avez pas déjà et Traefik va démarrer. Avec la configuration présente dans cette documentation, en saisissant l'URL de votre hôte docker et le port « 8080 » dans un navigateur web, vous accéderez à l'interface web de Traefik.

Maintenant, vous allez devoir configurer la définition des services et des middlewares, pour exploiter pleinement Traefik.
English article here.