Traefik - les bases
Traefik est un proxy inversé, un reverse proxy, qui se veut moderne et orienté Docker et micro services. Il est un sérieux concurrent à Nginx dans certains domaines, même si ce dernier reste globalement plus léger et plus rapide.
Avantages de Traefik
- configuration dynamique des règles de proxy via les labels Docker d'un conteneur
- gestion automatisée native des certificats SSL de Let's Encrypt - pour peu que le DNS autoritaire soit hébergé par un des fournisseurs pris en charge
- système d'authentification flexible
Utilisation basique
On commence par créer un réseau dédié au proxy dans Docker :
docker network create proxyL'utilisation la plus simple de Traefik consiste à le lancer dans un conteneur Docker :
version: '3'
services:
traefik:
image: traefik:v2.10
container_name: traefik
# Mise à disposition de l'interface Web et de la configuation
# via les labels Docker
command: --api.insecure=true --providers.docker
ports:
# On ouvre le port http...
- "80:80"
# ... et celui de l'interface Web
- "8080:8080"
volumes:
# Enfin, on autorise Traefik à discuter avec l'hôte Docker
# via son socket
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
networks:
proxy:
name: proxy
external: trueFichier docker-compose.yaml pour Traefik - configuration basique
Le dashboard Traefik peut être consulté sur la machine qui l'héberge, sur le port 8080.
Si la machine qui héberge Traefik est la machine locale, le dahsboard est accessible à l'URL http://localhost:8080.
Exposer un service via Traefik
Pour profiter de l'exemple ci-dessous, si la machine hébergeant le service est la machine locale, renseigner son fichierhostsavec l'entrée suivante :127.0.0.1 whoami.localhost
Une fois le conteneur lancé, Traefik peut être configuré via des labels Docker déclarés dans d'autres conteneurs. Par exemple :
version: '3'
services:
whoami:
# Un simple conteneur qui affiche son nom d'hôte
# et son adresse IP quand il est interrogé
image: traefik/whoami
container_name: whoami
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
networks:
- proxy
networks:
proxy:
name: proxy
external: trueFichier docker-compose.yml pour le service whoami
Le label de ce conteneur informe Traefik qu'il faut ouvrir une route http pour l'hôte whoami.localhost pour ce conteneur. Ainsi, quand une requête va atterrir sur Traefik demandant l'URL http://whoami.localhost, Traefik fera office de proxy et servira la page présente sur le conteneur whoami, sur le port exposé par celui-ci (puisque nous ne précisons pas manuellement de port pour ce service).
Le label est composé comme suit :traefik.http.routers.<nom du router>.rule=Host(<nom d'hôte entrant>)
Il configure un routeur http nommé whoami et stipule que ce routeur doit être employé si la condition suivante est respectée : la requête entrante doit être destinée à l'hôte nommé whoami.localhost. Dans le jargon Traefik, un routeur est un point d'acheminement des entrées / sorties du proxy.
Configuration YAML
Bien qu'on puisse tout à fait passer tous les paramètres de configuration à Traefik via le fichier docker-compose, il est généralement conseillé de recourir à un fichier de configuration. C'est une solution plus lisible et plus simple à maintenir.
La configuration basique de Traefik décrite plus haut présente un inconvénient majeur : Traefik ouvre automatiquement des règles par défaut pour tout nouveau conteneur. Nous allons corriger ça dans notre configuration YAML :
api:
dashboard: true
insecure: true
providers:
docker:
exposedByDefault: falseFichier traefik.yml
On doit apporter une modification au fichier docker-compose.yml de Traefik pour prendre en compte cette configuration :
version: '3'
services:
traefik:
image: traefik:v2.10
container_name: traefik
ports:
- "80:80"
- "8080:8080"
volumes:
# Notre configuration est montée à la racine du conteneur
# C'est là que Traefik ira la chercher
- ./traefik.yml:/traefik.yml:ro
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
networks:
proxy:
name: proxy
external: trueFichier docker-compose.yml pour Traefik - configuration par fichier YAML
On doit aussi apporter une modification à notre docker-compose.yml pour le service whoami. En effet, il faut désormais préciser à Traefik qu'il doit prendre en charge ce conteneur, ce n'est plus automatique depuis que ce comportement est désactivé dans la configuration YAML.
version: '3'
services:
whoami:
image: traefik/whoami
container_name: whoami
labels:
# On active la prise en charge du conteneur par Traefik
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
networks:
- proxy
networks:
proxy:
name: proxy
external: true
Member discussion