Docker : présentation et débuts avec Traefik

Docker : présentation et débuts avec Traefik

24 janvier 2020 0 Par Mairien Anthony

Nous allons voir dans cet article le fonctionnement de Traefik ainsi que son installation via un fichier Docker Compose.

Aujourd’hui nous allons donc découvrir ensemble ce qu’est Traefik (introduction, fonctionnement de base…) puis comment le déployer et comment relier quelques conteneurs à ce dernier. Sans plus attendre, commençons !

I) Traefik, kézako ?

Traefik est donc un edge proxy et load-balancer permettant de déployer principalement des conteneurs (microservices). Il est gratuit, Open Source, et son créateur est français ce qui fait toujours plaisir :p

Traefik va donc être installer en amont de notre réseau (edge router) et va intercepter les requêtes sur les ports que nous désirons, par exemple le port 80, 443, 22… ce sont ce que nous appelons des entrypoints. Ensuite, Traefik va faire transiter ces requêtes vers des routers, qui vont vérifier si ils doivent router ou non la requête. Par exemple, si dans le header de la requête HTTP il y a le nom de domaine « api.domain« , alors dans ce cas le router va transmettre la requête au service correspondant. On peut d’ailleurs concaténer certaines règles, de telle sorte que pour arriver à tel service, il faut que :

  • La requête arrive sur le port 80 ;
  • L’entête HTTP ait comme URL le domaine « web.notamax.be » ;
  • Et qu’il y est aussi un path, c’est-à-dire un chemin après le domaine, par exemple « web.notamax.be/admin » ;

De cette manière, si l’url est formulée correctement, on peut la transmettre à notre service « web » qui serait par exemple un site WordPress ou autre :

Cependant, juste après le passage auprès du router qui aura donc vérifié si la requête match ou non, on peut rajouter un « middleware » qui n’est rien d’autre qu’une modification de la requête initiale. Je m’explique :

Comme plus haut, une requête arrive sur Traefik sur l’entrypoint du port 80, avec comme url web.notamax.be/admin, et bien on peut dire qu’avant de transmettre cette requête à notre service web WordPress, on retire le /admin et on peut même aller plus loin en lui disant de modifier la requête pour la faire pointer sur un autre domaine, comme admin.notamax.be !

Vous voyez désormais un peu les possibilités que peut offrir Traefik ! Et encore, ce n’est qu’un simple résumé pour faire au plus simple, mais il regorge d’autres fonctionnalités très sympathiques, comme par exemple :

  • Support de Let’s Encrypt pour du routage HTTP/HTTPS et génération de certificats ;
  • Découverte automatique de services (avec support de Docker Swarm, Kubernetes, Mesos…), c’est-à-dire qu’une fois la partie « statique » de la configuration de Docker effectué (nous y reviendrons plus tard), le routage et autre se font quasiment voir totalement automatiquement étant donné que Traefik peut écouter le démon Docker ;
  • Lorsque qu’un conteneur Docker est supprimé puis relancé, son adresse IP change (c’est comme ça), et Traefik nous aide énormément en faisant par exemple correspondre un domaine vers un service sans se préoccuper de l’adresse IP du conteneur. Fort pratique donc !
  • Load-Balancing de services, cela se passe après le classique entrypoint/router/middleware, on peut configurer donc faire du scaling horizontal en round-robin pour des instnaces NGINX ou que sais-je ;
  • Comme dit juste avant, Traefik fait de la découverte de services, mais il peut en découvrir plusieurs en même temps ! Une instance K8s chez AWS, avec un cluster Docker Swarm, et une machine tournant avec un simple Docker-Compose et vous pouvez vous amuser avec le tout de manière quasi automatique !

Bref, la liste est encore longue… bien entendu, je ne vais couvrir que la base dans ce premier article, mais vous pouvez voir l’étendu de ce logiciel ! 😁

II) Installation et explications sur le fonctionnement

Bien, la première étape est donc de créer un dossier que l’on va sobrement appelé Traefik et dans lequel nous allons créer un fichier docker-compose.yml qui permettra de démarrer notre service traefik (notre conteneur). Nous allons aussi en profiter pour créer un sous-dossier nommé data avec deux fichiers à l’intérieur, nommés acme.json et traefik.yml.

(Le fichier acme.json sert à stocker les certificats Let’s Encrypt générés au fur et à mesure et le fichier traefik.yml contient quant à lui la configuration de traefik).

Bien, voici donc notre fichier docker-compose.yml :

version: '3'
services:
  traefik:
    restart: always
    image: traefik:v2.0
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports: 
      # Http, https
      - "80:80"
      - "443:443"
    volumes:
      # Chemin vers le fichier de configuration, fichier de certificats,accès Docker, et localtime de l'hôte
      - "./data/traefik.yml:/traefik.yml:ro"
      - "./data/acme.json:/acme.json"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/etc/localtime:/etc/localtime:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.localhost`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=it-anthony:$$apr1$$jEtBeIN8$$MhbywMULOmeDzi8M9op8J0"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.localhost`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=http"
      - "traefik.http.routers.traefik-secure.service=api@internal"
  web-01:
    restart: always
    image: httpd
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web-01.rule=Host(`web-01.localhost`)"  
      - "traefik.http.routers.web-01.entrypoints=http"
networks:
    proxy:
      external: true

Ici rien de très sorcier si vous êtes un minimum familier avec Docker Compose, d’ailleurs je peux vous renvoyer sur un article qui en parlait déjà, juste ici 😉

  • On déclare donc notre service traefik, basé sur l’image du même nom en version 2.0, avec l’ajout d’une sécurité supplémentaire (security_opt) ;
  • Nous rattachons ce conteneur au network nommé « proxy », que nous déclarons d’ailleurs en bas de fichier ;
  • Nous rattachons ensuite les fichiers contenus dans le dossier « data » ainsi que l’accès au démon docker et à l’heure de l’hôte, le tout en ReadOnly seulement ;
  • La directive traefik.enable=true permet d’exposer le conteneur directement en dehors de l’hôte ;
  • On connecte ensuite notre conteneur Traefik à l’entrypoint HTTP (port 80) et idem un peu plus bas pour l’HTTPS;
  • On active l’authentification avec un couple user/mot de passe ;
  • On donne un nom d’hôte à notre service ;
  • On active la redirection HTTP>HTTPS ;

Le fichier est normalement assez bien commenté 😉

*Si vous désirez changer le nom d’hôte pointant vers votre conteneur Traefik, il conviendra de modifier les deux valeurs traefik.localhost, ici étant donné que tout ceci est fait en local dans le cadre d’un lab, cette nomenclature est suffisante.

Je passe volontairement sur les autres directives pour ne pas trop vous embrouiller pour le moment, libre à vous d’aller feuilleter la doc (ma foi assez complète) pour en apprendre d’avantages.

Pour pouvoir chiffrer notre mot de passe il conviendra d’utiliser la commande htpasswd, disponible soit en installant le paquet httpd-tools, apache-tools ou bien tout simplement apache (suivant votre distribution, personnellement j’ai dû installé Apache). Une fois installé il nous suffit d’exécuter la commande suivante :

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

« USER » et « PASSWORD » sont bien entendu à modifier, et voici ce que vous devriez obtenir, dépendant du user et mot de passe choisis bien évidemment :

Bien, à partir de là notre fichier docker-compose est donc complet, nous pouvons passer à l’édition de notre fichier traefik.yml :

# Activation du dashboard
api:
  dashboard: true
# Création de deux entrypoints (80-443) avec un nom pour chaque
entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"
# Certificat pour challenge https
certificatesResolvers:
  http:
    acme:
      email: anthony@notamax.be
      storage: acme.json
      httpChallenge:
        entryPoint: http
# Provider Docker
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

Ici aussi je vais résumer grossièrement pour ne pas trop vous perdre, l’important à retenir est que :

  • dashboard: true permet comme son nom l’indique d’activer le dashboard de Traefik ;
  • entryPoints permet de spécifier les ports pour le service http et https de Traefik ;
  • providers défini comme son nom l’indique le « provider » de conteneurs, ici ce sera Docker mais nous aurions pu avoir par exemple Kubernetes ;
  • certificateResolvers permet de définir un challenge http pour la résolution des certificats SSL ;

Veillez d’ailleurs à bien changer le paramètre email par votre adresse personnelle.

A partir de là, nous avons déjà fait le plus gros ! Comme dit en début d’article, Traefik est décomposé en deux parties : une partie contenant la configuration dite « statique » (à faire obligatoirement, pas le choix) et une partie contenant la configuration « dynamique », qui comme son nom l’indique se fait de manière automatique (ou presque entièrement).

III) Démarrage de la stack et accès au dashboard

A ce niveau là, tout est normalement bon ! Nous pouvons donc nous rendre dans notre dossier traefik et effectuer un petit docker-compose up -d pour démarrer le tout :

Et maintenant, si l’on se rend sur l’url traefik.localhost et que l’on rentre les credentials créés précédemment :

Tadaaaa ! Notre conteneur Traefik est bel et bien fonctionnel avec une redirection HTTP>HTTPS ainsi qu’une authentification, et de même pour notre conteneur Apache !

IV) Infos supplémentaires et repo Github

Ceci conclut donc ce premier article traitant de Traefik, un edge router extrêmement populaire et français qui plus est. Nous n’avons pas encore vu la partie SSL via Let’s Encrypt ni le load-balancing, mais je préférais réaliser d’abord une introduction classique en expliquant les bases pour bien comprendre son fonctionnement.

Les fichiers de configurations sont disponibles sur mon Github, à cette adresse 😉