Fervent utilisateur de Docker, il m'arrive parfois d'être confronté à des difficultés lorsque certains services que je souhaite utiliser ne fonctionnent pas sur ce type d'architecture. Afin de contourner cette difficulté, je me suis penché sur la configuration de Traefik afin de découvrir s'il était possible de rediriger des requêtes HTTP vers un service non dockerisé.
Spoiler, c'est possible !
Configuration de Traefik
Voici la marche à suivre pour mettre en place cette fonctionnalité.
Pour cela, nous avons besoin du module file de traefik qui va nous permettre de prendre en compte la configuration de certains services via des fichiers. Nous avons également besoin de spécifier à traefik de surveiller ces configurations et d'indiquer le fichier ou le répertoire à surveiller.
Pour configurer ces options depuis la ligne de commande, il faut ajouter les labels suivants :
--file--file.watch--file.filenameET/OU--file.directory
Vous pouvez également activer ces options depuis le fichier de configuration de traefik. Il faudra pour cela écrire les lignes suivantes :
[file]
watch = true
# Uncomment filename to specify a file path
# filename = /path/of/my/configuration.toml
# Uncomment directory if you have multiple files
directory = /path/of/my/files/
Cela peut donner la configuration suivante dans un fichier compose :
traefik:
command: --web \
-c /dev/null \
--docker \
--docker.watch \
--docker.exposedbydefault=false \
--docker.domain="domain.tld" \
--accesslogsfile=/dev/stdout \
--defaultentrypoints="http,https" \
--entryPoints="Name:http Address::80" \
--entryPoints="Name:https Address::443 TLS" \
--entryPoints="Name:traefik Address::8080" \
--api=true \
--api.dashboard=true \
--api.statistics=true \
--api.statistics.recentErrors=20 \
--file \
--file.watch \
--file.directory=/opt/traefik/config/ \
--debug
environment:
- "affinity:container!=traefik*"
image: traefik:latest
networks:
- docker-net
ports:
- "80:80"
- "443:443"
- "8080:8080"
restart: always
volumes:
- //var/run/docker.sock:/var/run/docker.sock
- ./traefik-datas/secure:/root/secure
- ./traefik-datas/config:/opt/traefik/config:ro
Définition des services
Pour définir vos services, il est possible, selon la configuration que vous avez choisi d'implémenter, de tout configurer dans un fichier unique ou dans des fichiers séparés afin de gagner en lisibilité.
Quoi qu'il en soit, vous trouverez ci-dessous une configuration type de service :
[backends]
# Name of your backend
[backends.mybackend]
# Name of your service
[backends.mybackend.servers.myservice]
url = "http://127.0.0.1:9000"
[frontends]
[frontends.mybackend]
backend = "mybackend"
entryPoints = ["http", "https"]
passHostHeader = true
# Define headers
[frontends.mybackend.headers]
SSLRedirect = true
# Define rules
[frontends.mybackend.routes.myservice]
rule = "Host:my-service.domain.tld"
Cette feature vous permet donc d'intégrer à votre infrastructure Docker des services qui ne fonctionnent pas sur docker et qui peuvent éventuellement être sur des machines distantes.