Créez un environnement avec Docker et Traefik
Vous nous avez demandé un tutoriel sur comment mettre une configuration en place afin de rediriger les requêtes vers les bons containers en utilisant Traefik. L’utilisation de Traefik se déroulant presque exclusivement par des fichiers de configuration, j’ai préféré vous en parler via quelques exemples courants:
Exemple de configuration Traefik (traefik/docker-compose.yml)
Voici un fichier docker-compose.yml qui montera le container de Traefik. Les explications sont situées ci-dessous.
Explication
Ce docker-compose va en premier lieu télécharger l’image traefik:v2.2 via le docker hub. Traefik prendra toutes les requêtes entrantes sur le port 80 et 443.
La configuration est scindées en deux parties, la partie command et la partie labels.
Les commandes
La première partie commande sert à l’initialisation des variables de Traefik.
En tout premier lieu nous créons un réseau nommé traefik_web.
Attention: ici, le réseau s’appelle traefik_web car nous supposons que le fichier docker-compose.yml se situe dans un dossier nommé traefik². Docker va automatiquement concaténer le nom du dossier avec le nom du réseau.
Ici, nous allons mettre en place l’API web de docker. Cette API nous donnera des informations à propos de l’état de docker:
Ici, nous allons placer docker dans un réseau s’appelant traefik_web:
Si vous voulez ajouter un fichier de configuration dynamique, vous pouvez l’ajouter en décommentant cette ligne:
Nous définissions deux entrypoints:
- Un entrypoint nommé “http”, écoutant sur le port 80.
- Un entrypoint nommé “https”, écoutant sur le port 443.
80 et 443 sont les ports par défaut des requêtes sur le web.
Enfin, nous créons un “certificatesresolver” nommé “tls”, et qui générera un certificat SSL automatiquement:
Pour l’instant, rien de très sorcier.
Les labels
Les labels servent à configurer l’application. Ils se servent des variables de traefik déclarés plus haut.
Ici, nous allons mettre en place l’API web de Traefik, afin d’avoir des informations sur le container en temps réel.
Pour activer Traefik, vous devez écrire cette ligne.
Ici, nous allons créer un “middleware”. Un middleware est une fonction qui va capturer la requête ou la réponse, et qui va la modifier selon des critères. Ici, nous créons un exemple de middleware nommé http_to_https
. Comme son nom l’indique, ce middleware se chargera d’envoyer une entête au navigateur du client afin de le rediriger vers la version https du site:
Ici, cet autre middleware nommé “auth” sert à créer une porte d’authentification. La longue chaine de caractère est le résultat de la commande htpasswd -nbBC 10 test test
:
La commande donnée génère des identifiants qui ont pour nom “test” et mot de passe “test”.
Attention: il faut bien penser à doubler le caractère ”$” dans la chaine de caractère obtenue afin de pouvoir l’échapper
Une fois toutes les données mise en place, nous pouvons créer nos routes. Les routes sont les chemins que prendra le client pour accéder à notre application.
Ici, nous créons une route nommée “monitor”, avec des conditions:
- il faut que le nom de domaine soit “monitor.mon-domaine.com”
- il faut que le client passe par l’entrypoint nommé “http” (soit le port 80, comme déclaré dans la partie “commandes”)
La dernière ligne sert à, si le client arrive à passer ces conditions, de le rediriger vers la version “https” du site, grâce au middleware “http_to_https” déclaré ci-dessus.
Ici, nous allons voir la partie https du site:
Ici, nous créons une route nommée “monitor-secured”, écoutant sur l’entrypoint “https” (port 443) et vérifiant que le domaine “monitor.mon-domaine.com” soit bien utilisé. Traefik va devoir ici résoudre le certificat SSL via la fonction “tls”. Enfin, la méthode d’authentification “auth” va être utilisée (voir plus haut).
Un exemple de configuration de container (whoami/docker-compose.yml)
Pour configurer les conteneurs que l’on veut relier à Traefik, nous avons juste à utiliser les labels correspondant.
Le premier label traefik.enable=true
sert uniquement à activer Traefik.
les trois suivant créent une route nommée whoami
qui va tester si le nom d’hôte est bien whoami.mon-domaine.com
et si la requête est lancée sur le port 80 (http). Puis nous relions le middleware http_to_https
créé dans docker, qui va rediriger la connexion vers le port 443 (https).
Enfin pour terminer, les quatre dernières lignes vont créer une route nommée whoami-secured
qui va tester si le nom d’hôte est bien whoami.mon-domaine.com
et si la requête est lancée sur le port 443 (https). Dans ce cas ci, nous allons demander à Traefik d’envoyer le certificat SSL via la fonction tls
crée précédemment. La dernière ligne va appeler le middleware auth
, qui va demander un identifiant et un mot de passe à l’utilisateur (ici les pseudo et mot de passe sont “test” et “test”).
Un exemple nécessitant un container non accessible publiquement
Dans cette dernière partie, nous voyons un cas de figure fréquent : comment “cacher” un container qu’il ne soit pas accessible publiquement.
Ici, nous allons voir avec l’exemple de Nextcloud, mais cela fonctionne avec Wordpress ou toute autre image également !
Pour l’explication, l’astuce va être de créer un network
nommé backend
.
Ce réseau va être utilisé par les deux containers, et ne sera pas accessible publiquement !
En savoir plus
-
La configuration de Mau5Machine:
Simplifiez les conditions avec les opérateurs logiques et opérateurs ternaires
Découvrez une nouvelle manière de simplifier votre code
Écrivez plus vite en HTML avec Emmet
Ne vous embêtez plus avec les balises !
Introduction à Vim
Devenez un super développeur grâce à Vim !
Introduction aux jobs linux
Gagnez en rapidité avec les jobs