Dans un précédent article, j'avais présenté Traefik, un outil Open Source pour exposer vos containers Docker sur le web. Il est passé en version 2 récemment et la configuration a un peeeeeeu changé.

On va commencer par créer un container Traefik, et sa configuration correspondante. Voici mon docker-compose.yml :

version: "3.3"
services:
    traefik:
        image: traefik:v2.0
        restart: unless-stopped
        security_opt:
            - no-new-privileges:true
        ports:
            - 80:80
            - 443:443
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock:ro
            - ./conf/traefik.yml:/traefik.yml:ro
            - ./conf/acme.json:/acme.json
        labels:
            traefik.enable: true
            # HTTP
            traefik.http.routers.traefik.entrypoints: http
            traefik.http.routers.traefik.rule: Host(`traefik.monsite.co`)
            # Dashboard
            traefik.http.routers.traefik-secure.service: [email protected]
            traefik.http.routers.traefik-secure.middlewares: traefik-auth
            traefik.http.middlewares.traefik-auth.basicauth.users: "USER:PASSWORD"
            # Middleware
            traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme: https
            traefik.http.routers.traefik.middlewares: traefik-https-redirect
            # HTTPS
            traefik.http.routers.traefik-secure.entrypoints: https
            traefik.http.routers.traefik-secure.rule: Host(`traefik.monsite.co`)
            traefik.http.routers.traefik-secure.tls: true
            traefik.http.routers.traefik-secure.tls.certresolver: http
        networks:
            - traefik_network

networks:
    traefik_network:
        external: true
docker-compose.yml

On ouvre les ports 80 pour HTTP et 443 pour HTTPS.

La ligne traefik.enable: true active l'exposition du container sur le Web.

Les lignes qui commencent par traefik.http.routers.traefik indique quel protocole et quelle URL permettent d'accéder au container (ici http et traefik.monsite.co).

Via les lignes qui commencent par traefik.http.routers.traefik-secure, on défini un "router" traefik-secure qui indique quel protocole et quelle URL permettent d'accéder au container de manière sécurisée (ici https et toujours traefik.monsite.co).

Comme dans la version 1 de Traefik, on crée un network entre les containers pour que l'outil puisse découvrir les nouveaux containers qui auront besoin de lui.

Au niveau des fichiers de configuration, on a acme.json, qui va contenir les clés SSL au fur et à mesure de leur création, et traefik.yml qui contient la configuration de Traefik :

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  http:
    acme:
      email: [email protected]
      storage: acme.json
      httpChallenge:
        entryPoint: http
traefik.yml

On redéfini ici les deux points d'entrée (http et https) et comment se fait la résolution des certificats SSL (ici via un challenge HTTP).

Redirection HTTP vers HTTPS

Pour que les requêtes http soient routées automatiquement vers une connexion sécurisée https, on défini un middleware traefik-https-redirect.

[...]
            # Middleware
            traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme: https
            traefik.http.routers.traefik.middlewares: traefik-https-redirect
docker-compose.yml

Le dashboard

Comme dans la version 1, on veut un dashboard graphique pour suivre le fonctionnement de Traefik. Pour cela, on rajoute dans le fichier traefik.yml le bloc :

api:
  dashboard: true
traefik.yml

On ajoute ensuite une authentification "basic" avec accès par login/mot de passe. Ca se fait via la ligne traefik.http.middlewares.traefik-auth.basicauth.users: "USER:PASSWORD". Remplacez le couple USER:PASSWORD par vos identifiants.

NB : pour créer la paire USER:PASSWORD, utilisez la commande suivante :

echo $(htpasswd -nb USER PASSWORD) | sed -e s/\\$/\\$\\$/g

Connecter un nouveau container Docker

Enfin, quand on rajoute un nouveau service et que l'on souhaite qu'il soit pris en charge par Traefik, il faut rajouter quelques informations dans son docker-compose.yml :

        [...]
        labels:
            traefik.enable: true
            traefik.http.routers.monsite.entrypoints: http
            traefik.http.routers.monsite.rule: Host(`monsite.co`)
            traefik.http.middlewares.monsite-https-redirect.redirectscheme.scheme: https
            traefik.http.routers.monsite.middlewares: monsite-https-redirect
            traefik.http.routers.monsite-secure.entrypoints: https
            traefik.http.routers.monsite-secure.rule: Host(`monsite.co`)
            traefik.http.routers.monsite-secure.tls: true
            traefik.http.routers.monsite-secure.tls.certresolver: http
            traefik.http.routers.monsite-secure.service: monsite
            traefik.http.services.monsite.loadbalancer.server.port: 2368
            traefik.docker.network: traefik_network
docker-compose.yml

Comment dans la configuration du container de Traefik, on défini les deux points d'entrée (http et https pour la partie sécurisée) et les URL associées.

On rajoute un middleware pour renvoyer automatiquement les requêtes http vers la partie sécurisée.

Et n'oublions pas de connecter le container au network sur lequel est Traefik pour que ce dernier découvre automatiquement le nouveau container.


J'ai mis un peu de temps à comprendre la nouvelle façon de configurer Traefik, alors j'espère que cet article vous fera gagner du temps. Et comme toujours, n'hésitez pas à aller piocher dans la documentation de Traefik pour adapter le code à votre projet.