Træfik 
Træfik est un outil de reverse proxy: il permet de n'exposer qu'une seule adresse à l'extérieur et de rediriger en interne vers la bonne adresse. Voici un schéma présentant son fonctionnement:

Il est simple et rapide à configurer puisqu'il s'agit d'une simple image Docker.
1 - Créer un répertoire traefik, où seront stockés le docker-compose.yml et le sous-dossier data contenant les fichiers .toml de configuration de Træfik.
2 - Dans ce dossier traefik, créer un fichier docker-compose.yml:
version: '3' services: traefik: #Image Docker officielle image: 'traefik:1.7-alpine' restart: 'always' #Ports d'exposition de Traefik ports: - '80:80' - '443:443' #Réseau(x) virtuel(s) sur lesquels se trouve le conteneur #et sur lesquels doivent se trouver les conteneurs #que l'on souhaite mettre sur Traefik networks: web: volumes: #Le daemon docker va être au même endroit sur la machine #hôte et sur le conteneur - '/var/run/docker.sock:/var/run/docker.sock' - './<path/to>/traefik.toml:/traefik.toml' - './<path/to>/acme.json:/acme.json' - './<path/to>/rules.toml:/rules.toml' container_name: 'traefik' labels: #Dire à Traefik de gérer ce conteneur, qu'il a #une redirection à faire traefik.enable: 'true' #Quelles adresses rediriger vers ce conteneur traefik.frontend.rule: 'Host:<domaine>' #Sur quel port rediriger les connexions traefik.port: '8080' #Mettre le conteneur sur le réseau web/Passer par le réseau web traefik.docker.network: 'web' networks: web: #Le réseau existe déjà, pas besoin de le créer external: 'true'
Exemple: les fichiers .toml se trouvent dans le répertoire dataTraefik
version: '3' services: traefik: image: 'traefik:1.7-alpine' restart: 'always' ports: - '80:80' - '443:443' networks: web: volumes: #Le daemon docker va être au même endroit sur la machine #hôte et sur le conteneur - '/var/run/docker.sock:/var/run/docker.sock' - './dataTraefik/traefik.toml:/traefik.toml' - './dataTraefik/acme.json:/acme.json' - './dataTraefik/rules.toml:/rules.toml' container_name: 'traefik' labels: #Dire à Traefik de gérer ce conteneur, qu'il a #une redirection à faire traefik.enable: 'true' #Quelles adresses rediriger vers ce conteneur traefik.frontend.rule: 'Host:traefik.nolwenn.bobbyblues.com' #Sur quel port rediriger les connexions traefik.port: '8080' #Mettre le conteneur sur le réseau web/Passer par le réseau web traefik.docker.network: 'web' networks: web: #Le réseau existe déjà, pas besoin de le créer external: 'true'
3 - Dans le sous-répertoire data, écrire le fichier traefik.toml
defaultEntryPoints = ["http", "https"] [entryPoints] [entryPoints.dashboard] #Port d'exposition pour Traefik address = ":8080" #Port par défaut pour HTTP [entryPoints.http] address = ":80" #Rediriger le HTTP vers du HTTPS [entryPoints.http.redirect] entryPoint = "https" #Port par défaut pour HTTPS [entryPoints.https] address = ":443" #Dire quel chiffrement utiliser pour le HTTPS [entryPoints.https.tls] [api] entryPoint = "dashboard" [acme] email = <email> storage = "acme.json" entryPoint = "https" acmeLogging = true onHostRule = true [acme.httpChallenge] entryPoint = "http" [docker] #Traefik doit accéder aux autres conteneurs Docker et savoir ce qui existe endPoint = "unix:///var/run/docker.sock" domain = <domaine> watch = true #Tous les conteneurs que l'on va vouloir exposer à l'extérieur doivent être dans le réseau 'web' network = "web" [retry] [web] address = ":8080"
Exemple :
defaultEntryPoints = ["http", "https"] [entryPoints] [entryPoints.dashboard] #Port d'exposition pour Traefik address = ":8080" #Port par défaut pour HTTP [entryPoints.http] address = ":80" #Rediriger le HTTP vers du HTTPS [entryPoints.http.redirect] entryPoint = "https" #Port par défaut pour HTTPS [entryPoints.https] address = ":443" #Dire quel chiffrement utiliser pour le HTTPS [entryPoints.https.tls] [api] entryPoint = "dashboard" [acme] email = "adresse@email.com" storage = "acme.json" entryPoint = "https" acmeLogging = true onHostRule = true [acme.httpChallenge] entryPoint = "http" [docker] #Traefik doit accéder aux autres conteneurs Docker et savoir ce qui existe endPoint = "unix:///var/run/docker.sock" domain = "bobbyblues.com" watch = true #Tous les conteneurs que l'on va vouloir exposer à l'extérieur doivent être dans le réseau 'web' network = "web" [retry] [web] address = ":8080"
4 - Toujours dans le sous-répertoire dataTraefik, créer un fichier acme.json qui contiendra toutes les informations concernant les certificats et changer ses droits pour que seul le propriétaire puisse le lire et écrire:
touch acme.json
chmod 600 acme.json
5 - Créer également un fichier rules.toml qui pourra contenir des règles supplémentaires pour Træfik ou rester vide:
touch rules.toml
Utilisation de Træfik
1 - Lancer le docker-compose.yml depuis le répertoire contenant le fichier:
docker-compose up -d
Pour plus d'informations sur Docker Compose, se référer à la documentation.
2 - Pour exposer un conteneur via Træfik, éditer le fichier docker-compose.yml de ce conteneur et ne pas oublier de placer le conteneur sur le même réseau que Traefik :
labels: traefik.enable: 'true' traefik.frontend.rule: 'Host:<precise.domaine>' #Port du conteneur, pas le port exposé à l'extérieur traefik.port: 'port' networks: web: external: 'true'
Exemple : Exposition de Kanboard via Træfik
labels: traefik.enable: 'true' traefik.frontend.rule: 'Host: kanboard.nolwenn.bobbyblues.com' traefik.port: '80' networks: web: external: 'true'
Il suffit ensuite de redémarrer le conteneur et de se connecter à l'adresse precise.domaine.
Exemple : Se connecter à l'adresse suivante https://kanboard.nolwenn.bobbyblues.com