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.filename ET/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.