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
technique:tech_team:traefik_usage [2021/11/16 01:03] qduchemitechnique:tech_team:traefik_usage [2023/11/24 23:52] (Version actuelle) qduchemi
Ligne 7: Ligne 7:
 - Une sécurisation via HTTPS - Une sécurisation via HTTPS
  
-On a vu dans la [[technique:tech_team:traefik|page sur Traefik]] qu'il fallait utiliser deux outils Docker pour ce faire : les **labels** et les **réseaux**+On a vu dans la [[technique:tech_team:traefik|page sur Traefik]] qu'il fallait utiliser deux outils Docker pour ce faire : les **labels** et les **réseaux**.
  
 ### Labels Docker ### Labels Docker
Ligne 15: Ligne 15:
 ``` ```
 docker inspect quentin docker inspect quentin
-``` +[...]
- +
-```json+
 "Labels": { "Labels": {
     "com.docker.compose.config-hash": "5a156a0c24e4cd4fefc3b4fb1e35608826ecb6a72de130d7d1b03029f9ab363e",     "com.docker.compose.config-hash": "5a156a0c24e4cd4fefc3b4fb1e35608826ecb6a72de130d7d1b03029f9ab363e",
Ligne 28: Ligne 26:
     "com.docker.compose.version": "1.27.3"     "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 :
 +
 +{{ :technique:tech_team:networks_docker.png |}}
 +
 +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.
 +
 +<bootnote>Ç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.</bootnote>
 +
 +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 : 
 +
 +{{ :technique:tech_team:networks_docker_traefik.png |}}
 +
 +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.
 +
 +<bootnote>Ce réseau s'appelle `proxy`, c'est fixé et ça ne bougera plus.</bootnote>
 +
 +<bootnote warning>
 +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 [[technique:docker:picasoft:dockerfiles|section dédiée]].</bootnote>
 +
 +Au niveau de notre dernier fichier Compose, ça se traduit par ceci :
 +
 +```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 ?
 +
 +<bootnote learn>Il existe déjà une [[technique:docker:good_practices:traefik|page qui résume l'utilisation de Traefik]] sur le wiki, tu peux aller la lire si tu veux!</bootnote>
 +
 +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](https://doc.traefik.io/traefik/routing/overview/). 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 :
 +
 +```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 :
 +
 +```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
 +```
 +
 +<bootnote>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 !</bootnote>
 +
 +### Let's go !
 +
 +{{ :technique:tech_team:traefik_https.gif |}}
 +
 +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.
 +
 +<bootnote question>Pourquoi cette redirection ?</bootnote>
 +
 +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.
 +
 +<bootnote>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.</bootnote>
 +
 +### Pour la curiosité...
 +
 +<bootnote learn>C'est difficile d'y accéder pour des raisons de sécurité, mais sache qu'il existe un joli [[technique:adminserv:traefik:dashboard|tableau de bord]] permettant d'y voir plus clair sur ce qu'il se passe avec Traefik. :-)</bootnote>
 +
 +### 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. ^_^
  
-te      +Alors peut-être qu'on peut rentrer dans le bain en [[technique:tech_team:etherpad|mettant à jour Etherpad ?]] Et enfin, on verra les détails qui manquent pour [[technique:tech_team:new_service|créer pour de vrai un service Picasoft]] !
  • technique/tech_team/traefik_usage.1637021021.txt.gz
  • de qduchemi