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.

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.

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.

Attention:

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.

  • technique/tech_team/traefik_usage.1637022064.txt.gz
  • de qduchemi