Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
technique:docker:general:traefik [2020/10/07 20:42] qduchemitechnique:docker:general:traefik [2021/10/17 02:49] qduchemi
Ligne 1: Ligne 1:
-{{indexmenu_n>50}}+{{indexmenu_n>60}}
 # Traefik, un reverse-proxy pour Docker # Traefik, un reverse-proxy pour Docker
  
Ligne 29: Ligne 29:
 Une technique traditionnelle, lorsque plusieurs services tournent sur une même machine et doivent être accessibles via Internet, est d'utiliser les ports pour la destination. Ainsi, chaque conteneur écoute sur un port particulier de la machine. Par exemple, on aurait la situation suivante : Une technique traditionnelle, lorsque plusieurs services tournent sur une même machine et doivent être accessibles via Internet, est d'utiliser les ports pour la destination. Ainsi, chaque conteneur écoute sur un port particulier de la machine. Par exemple, on aurait la situation suivante :
  
-{{:technique:docker:general:without_traefik_ports.png?400|}}+{{ :technique:docker:general:without_traefik_ports.png |}}
  
 Ainsi, chaque conteneur écoute sur un port spécifique : Ainsi, chaque conteneur écoute sur un port spécifique :
Ligne 38: Ligne 38:
 <bootnote question>Quel est le problème avec cette configuration ?</bootnote> <bootnote question>Quel est le problème avec cette configuration ?</bootnote>
  
-C'est une solution simple, néanmoins elle nécessite d'utiliser les ports dans l'URL, et ce n'est vraiment pas pratique pour les utilisateurices. Les sites web que l'on consulte tous les jours n'ont pas d'URL dans leur numéro de port, en général.+C'est une solution simple, néanmoins elle nécessite d'utiliser les ports dans l'URL, et ce n'est vraiment pas pratique pour les utilisateurices. Les sites web que l'on consulte tous les jours n'ont pas de numéro de port dans leur URL, en général.
  
 ## Utiliser un reverse proxy ## Utiliser un reverse proxy
Ligne 47: Ligne 47:
 * Un *reverse proxy* est un serveur vers lequel sont redirigées toutes les requêtes qui **entrent** vers un ordinateur. * Un *reverse proxy* est un serveur vers lequel sont redirigées toutes les requêtes qui **entrent** vers un ordinateur.
  
-L'idée est donc qu'un reverse proxy écoute sur les port 80 et 443 (qui n'ont pas besoin d'être spécifiés dans l'URL), et qu'il redirige automatiquement vers le bon conteneur, grâce à l'URL de la requête. +L'idée est donc qu'un reverse proxy écoute sur les port 80 et 443 (qui n'ont pas besoin d'être spécifiés dans l'URL), et qu'il redirige automatiquement vers le bon conteneur, grâce à l'URL de la requête. La situation sera la suivante, avec Traefik : 
 + 
 +{{ :technique:docker:general:with_traefik_443.png |}}
  
 <bootnote question>Comment associer une URL à un conteneur ?</bootnote> <bootnote question>Comment associer une URL à un conteneur ?</bootnote>
Ligne 55: Ligne 57:
 C'est pourquoi nous utilisons Traefik, un outil clé en main pour Docker. Traefik fonctionne comme un reverse proxy traditionnel, mais ajoute quelques fonctionnalités bien pratiques : C'est pourquoi nous utilisons Traefik, un outil clé en main pour Docker. Traefik fonctionne comme un reverse proxy traditionnel, mais ajoute quelques fonctionnalités bien pratiques :
  
-{{:technique:docker:general:traefik.png?400|}}+{{ :technique:docker:general:traefik.png?800 |}}
  
 * L'association entre URL et conteneur se fait grâce aux [labels Docker](https://docs.docker.com/config/labels-custom-metadata/), ce qui évite de modifier la configuration du reverse-proxy à l'ajout d'un nouveau service. * L'association entre URL et conteneur se fait grâce aux [labels Docker](https://docs.docker.com/config/labels-custom-metadata/), ce qui évite de modifier la configuration du reverse-proxy à l'ajout d'un nouveau service.
Ligne 63: Ligne 65:
  
 En somme, pour ajouter un nouveau service accessible depuis internet via HTTPS, il suffit d'ajouter quelques labels sur le conteneur, et à son lancement, il est accessible *automagiquement*, sans configuration supplémentaire. En somme, pour ajouter un nouveau service accessible depuis internet via HTTPS, il suffit d'ajouter quelques labels sur le conteneur, et à son lancement, il est accessible *automagiquement*, sans configuration supplémentaire.
 +
 +## Configuration
 +
 +<bootnote web>Pour les curieux.ses, une explication de la configuration est aussi disponible [[technique:old:migration-traefik-v2|sur la page de migration vers Traefik v2]].</bootnote>
 +
 +On ne présente pas ici la manière de configurer Traefik, qui évolue au fil du temps, mais les choix qui ont été faits et les points de vigilance.
 +
 +### Sécurisation
 +
 +Traefik permet de sécuriser les services web en établissant une connexion TLS (HTTPS) entre les clients et lui. Il communique ensuite avec les conteneurs sur le réseau privé Docker, en clair (HTTP). Il est donc fondamental qu'il soit bien sécurisé. En particulier, voici quelques options de configuration qui ont été ajoutées :
 +
 +* Forcer à rediriger les requêtes HTTP vers HTTPS.
 +* Utilisation de Let's Encrypt pour créer et renouveller automatiquement les certificats des services.
 +* Restriction de la version de TLS minimale (actuellement, 1.2).
 +* Restriction des algorithmes de chiffrement utilisés (*ciphers*), pour éviter les plus faibles tout en garantissant une compatibilité avec la plupart des appareils.
 +* Injection de *headers* de sécurité dans toutes les requêtes et réponses, permettant de limiter les risques d'attaques classiques (XSS, MITM, etc).
 +
 +### Performance
 +
 +Traefik est aussi configuré pour compresser l'ensemble des flux qui transitent par son biais, sauf les flux de streaming (*e.g.* vidéo...).
 +
 +### Docker
 +
 +Traefik se trouve dans le réseau Docker appelé `proxy`. Il inspecte tous les conteneurs de ce réseau et décide s'il doit router vers ces conteneurs, en fonction de leurs labels.
 +
 +<bootnote warning>Tout conteneur qui ne se trouve pas dans le réseau `proxy` ne sera jamais pris en compte par Traefik.</bootnote>