Træfik logo

Documentation officielle

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:

Fonctionnement de Traefik

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