Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
technique:docker:good_practices:traefik [2020/10/13 16:16] – [Préambule] qduchemi | technique:docker:good_practices:traefik [2022/09/23 10:21] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{indexmenu_n> | ||
+ | # Rendre un service accessible publiquement | ||
+ | ## Préambule | ||
+ | |||
+ | Quand un conteneur Docker doit être accessible depuis l' | ||
+ | |||
+ | * Mapper un port de l' | ||
+ | * Utiliser [[technique: | ||
+ | |||
+ | < | ||
+ | La règle générale est la suivante : on utilise un mapping de port pour les services **non-web** (*e.g.* LDAP, mail, SFTP...) et Traefik pour tous les services web. Une explication se trouve sur la [[technique: | ||
+ | |||
+ | ## Mapping de port | ||
+ | |||
+ | C'est la technique la plus simple. Supposons qu'un conteneur écoute sur son port interne 8080, et qu'on veuille le rendre accessible depuis l' | ||
+ | |||
+ | ```yaml | ||
+ | services: | ||
+ | example: | ||
+ | image: < | ||
+ | ports: | ||
+ | - 2000:8080 | ||
+ | ``` | ||
+ | |||
+ | Dans cet exemple, tout ce qui arrive sur le port `2000` de la machine sera redirigé sur le port `8080` du conteneur. | ||
+ | |||
+ | < | ||
+ | |||
+ | ## Utiliser Traefik | ||
+ | |||
+ | Pour les services web, on préfère largement passer par Traefik, car on pourra utiliser un port standard (`80` ou `443`) et profiter de toutes ses fonctionnalités (HTTPS automatique, | ||
+ | |||
+ | On configure le fait de router vers un conteneur grâce aux [labels Docker](https:// | ||
+ | |||
+ | ```yaml | ||
+ | networks: | ||
+ | proxy: | ||
+ | external: true | ||
+ | |||
+ | services: | ||
+ | exemple: | ||
+ | container_name: | ||
+ | networks: | ||
+ | - proxy | ||
+ | labels: | ||
+ | # Traefik va prendre ce conteneur en compte | ||
+ | traefik.enable: | ||
+ | # websecure correspond au port 443 de la machine (config Traefik) | ||
+ | # Remplacer < | ||
+ | traefik.http.routers.< | ||
+ | # Il redirigera vers ce port, exposé par le conteneur | ||
+ | # Remplacer < | ||
+ | # Remplacer app.picasoft.net par l'URL souhaitée | ||
+ | traefik.http.routers.< | ||
+ | # Lorsque l' | ||
+ | # Remplacer < | ||
+ | # Remplacer 8080 par le port du service | ||
+ | traefik.http.services.< | ||
+ | ``` | ||
+ | |||
+ | < | ||
+ | |||
+ | `websecure` désigne, dans la configuration Traefik, le port 443. Tout ce qui arrive vers Traefik est redirigé vers cet entrypoint, il faut donc se coller dessus. | ||
+ | |||
+ | < | ||
+ | |||
+ | ## Sécuriser une sous-partie du service par authentification | ||
+ | |||
+ | Il y a pas mal de cas d' | ||
+ | |||
+ | - La partie `/admin` d'un service exposé sur internet mais sans authentification intégrée au service | ||
+ | - La partie `/metrics` d'un service qui doit être accessible à [[technique: | ||
+ | |||
+ | La solution consiste à créer un second point d' | ||
+ | |||
+ | ```yaml | ||
+ | # Toujours le même point d' | ||
+ | traefik.http.routers.< | ||
+ | # Ce point d' | ||
+ | # vers app.picasoft.net/ | ||
+ | traefik.http.routers.< | ||
+ | # Indique que ce point d' | ||
+ | # configuré via les labels Docker (voir juste en dessous) | ||
+ | traefik.http.routers.< | ||
+ | # Ce middleware est simplement une authentification, | ||
+ | # et l' | ||
+ | traefik.http.middlewares.< | ||
+ | ``` | ||
+ | |||
+ | La chaîne `$2y$10$7Gv5tUZC1UBsTyQs/ | ||
+ | |||
+ | < | ||
+ | Pour éviter de versionner la chaîne d' | ||
+ | |||
+ | ``` | ||
+ | METRICS_AUTH=test: | ||
+ | ``` | ||
+ | |||
+ | En effet, Docker Compose lit les fichiers `.env` et remplace les variables par leur valeur dans le fichier Compose. De plus, Git ignore les fichiers cachés par défaut, on ne risque pas de commiter les secrets par erreur. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Pour générer la chaîne d' | ||
+ | |||
+ | On utilise ensuite la commande suivante pour générer la chaîne d' | ||
+ | ``` | ||
+ | $ echo $(htpasswd -nb USER PASSWORD) | ||
+ | USER: | ||
+ | ``` | ||
+ | </ |