Comment on utilise Traefik ?
On va reprendre là où on en était resté avec notre premier fichier Compose. On avait alors un serveur web accessible à l’adresse pica01-test.picasoft.net:8001
, et on voulait plusieurs choses :
- Une URL qui claque un peu plus, genre
quentin.test.picasoft.net
- Une sécurisation via HTTPS
On a vu dans la page sur Traefik qu’il fallait utiliser deux outils Docker pour ce faire : les labels et les réseaux.
Labels Docker
Les labels sont des simples éléments clé-valeur attaché à un conteneur. Il en existe pas mal de base, même sans avoir à en rajouter. La commande docker inspect
me permet de les voir :
docker inspect quentin [...] "Labels": { "com.docker.compose.config-hash": "5a156a0c24e4cd4fefc3b4fb1e35608826ecb6a72de130d7d1b03029f9ab363e", "com.docker.compose.container-number": "1", "com.docker.compose.oneoff": "False", "com.docker.compose.project": "qduchemi", "com.docker.compose.project.config_files": "docker-compose.yml", "com.docker.compose.project.working_dir": "/home/users/qduchemi", "com.docker.compose.service": "quentin", "com.docker.compose.version": "1.27.3" } [...]
On voit que Compose a déjà ajouté plein de labels sans qu’on ne s’en rende compte.
Traefik surveille en permanence les nouveaux conteneurs et se sert de leurs labels pour savoir s’il doit les prendre en compte, et que faire d’eux. En particulier, Traefik a besoin de trois informations essentielles :
- À quelle URL répond le conteneur ?
- Quel est le port du conteneur sur lequel envoyer les requêtes qui lui sont destinées ?
- Faut-il activer le HTTPS sur le conteneur (i.e. déclencher automatiquement la procédure de certification…) ?
On voit ça juste après.
Réseaux Docker
Les réseaux Docker ne sont pas très différents des réseaux classiques : ils permettent à des conteneurs de communiquer entre eux (ou au contraire, d’être isolés).
Prenons cet exemple :
Mattermost et sa base de données sont isolés au sein d’un même réseau, comme Etherpad et sa base de données. Chaque application peut communiquer avec sa base de données, mais il est impossible de communiquer entre la base de données de Mattermost et celle d’Etherpad.
Note:
Ça a du sens, notamment en cas de compromission, puisque la base de données de Mattermost n’a aucune raison de parler à celle d’Etherpad. On limite ainsi la casse d’une faille de sécurité potentielle.
Traefik agit comme un reverse proxy pour les services web ; il a donc besoin d’être dans le même réseau qu’eux. Un conteneur peut être dans plusieurs réseaux. La situation ressemblait alors à ceci :
Or par défaut, tous les conteneurs d’un fichier Compose sont dans leur propre réseau. Il faut donc les rajouter au réseau de Traefik.
Note:
Ce réseau s’appelle proxy
, c’est fixé et ça ne bougera plus.
Attention:
S’assurer que Traefik est bien lancé sur la machine de test :
cd /DATA/docker/services/traefik docker-compose up -d
Ici, on commence à toucher à la manière dont Picasoft gère ses services, on ne rentre pas dans les détails, il y a une section dédiée.
Au niveau de notre dernier fichier Compose, ça se traduit par ceci :
- snippet.yaml
networks: proxy: external: true services: quentin: [...] networks: - proxy
On indique qu’on veut utiliser un réseau Docker qui existe par ailleurs (d’où le external: true
), et on indique que notre service participe à ce réseau.
Alors, comment on fait ?
A Savoir:
Il existe déjà une page qui résume l'utilisation de Traefik sur le wiki, tu peux aller la lire si tu veux!
Le point noir, c’est que les labels sont compliqués à comprendre, et qu’on ne peut pas les expliquer sans rentrer profondément dans les détails de Traefik. Alors, on va juste se dire que « c’est comme ça ».
Et on reprend notre exemple. Pour rappel, on avait un serveur web qui tournait sur pica01-test.picasoft.net:8081
grâce au fichier Compose suivant :
- snippet.yaml
version: "3.7" services: quentin: image: nginx:quentin container_name: quentin ports: - 8081:80 volumes: - ./website:/var/www/html
On va donc ajouter quentin
dans le réseau proxy
, lui indiquer qu’on veut répondre à l’adresse quentin.test.picasoft.net
, rediriger vers le port 80 du conteneur et activer HTTPS. Le fichier final est comme suit :
- snippet.yaml
version: "3.7" networks: proxy: external: true services: quentin: image: nginx:quentin container_name: quentin networks: - proxy labels: traefik.enable: true traefik.http.routers.quentin.entrypoints: websecure traefik.http.routers.quentin.rule: Host(`quentin.test.picasoft.net`) traefik.http.services.quentin.loadbalancer.server.port: 80 volumes: - ./website:/var/www/html
Note:
On a supprimé le mapping de port entre l’hôte et le conteneur, puisque désormais c’est Traefik qui s’occupe de tout !
Let's go !
On constate deux choses :
- Le conteneur est accessible via sa propre URL, qui donne beaucoup plus envie que celle composée du nom de la machine et du port.
- Cette fois ci, un
curl
simple renvoie un code HTTP 302 (Moved Permanently
). Si on demande àcurl
de suivre les redirections (-L
), on arrive à la bonne page.
Question:
Pourquoi cette redirection ?
C’est lié à la ligne :
traefik.http.routers.quentin.entrypoints: websecure
Qui indique à Traefik que tout ce qui arrive à destination de ce conteneur doit passer par le point d’entrée websecure
, c’est-à-dire par HTTPS dans notre configuration.
Or quand on fait un curl quentin.test.picasoft.net
, Traefik reçoit la requête sur le port 80. HTTPS est sur le port 443, alors il nous renvoie une redirection qui veut dire « reviens sur le port 443 et on pourra parler de manière sécurisée.
Note:
Toute l’opération de certification pour activer HTTPS s’est faite automatiquement et en quelques secondes ! C’est vraiment pratique, car gérer les certificats à la main et pour chaque service est long et sujet aux erreurs. Ici, il suffit d’ajouter trois labels et Traefik gère tout pour nous, y compris le renouvellement des certificats.
Pour la curiosité...
A Savoir:
C’est difficile d’y accéder pour des raisons de sécurité, mais sache qu’il existe un joli tableau de bord permettant d’y voir plus clair sur ce qu’il se passe avec Traefik.
Et maintenant ?
Bon, et bien à ce stade, tu as absolument toutes les bases pour lancer un service Picasoft ! Construire une image Docker, comprendre les réseaux, les ports et les volumes, utiliser Compose et enfin mettre le service sur internet grâce à Traefik.
Alors peut-être qu’on peut rentrer dans le bain en mettant à jour Etherpad ? Et enfin, on verra les détails qui manquent pour créer pour de vrai un service Picasoft !