Utilisation conquis de Docker pour mes sites en local, je souhaitais l'utiliser également en production pour harmoniser mon workflow. Mais l'exposition des containers était compliqué… jusqu'à ce que je découvre Traefik.

Traefik, c'est un reverse-proxy / load balancer Open Source.

La grosse force de Traefik, en plus de sa facilité d'utilisation, c'est sa parfaite intégration à l'univers Docker. Il me permet, rapidement et très facilement, d'exposer mes différents containers Docker à Internet, et d'y coller un certificat SSL généré automatiquement.

Je n'ai donc plus à me soucier d'une configuration Nginx compliquée. Traefik va automatiser le routage des domaines et sous-domaines vers les containers correspondant. Il automatise également la génération des certificats SSL via Let's Encrypt. Que du bonheur donc.

Du coup, comment on fait pour mettre Traefik en place ?

Dans un premier temps, on va mettre en place Traefik via un container Docker (pas folle la guêpe) et on le branche à un external network. Au fur et à mesure qu'on branchera des containers à ce network, Traefik les prendra en compte.

Pour ça, je crée un fichier docker-compose.yml :

version: '3.2'
services:
    traefik:
        image: traefik:1.7.3 # The official Traefik docker image
        restart: always
        command: --api --docker # Enables the web UI and tells Traefik to listen to docker
        ports:
            - "80:80"     # The HTTP port
            - "443:443"   # The HTTPS port
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
            - ./conf/traefik.toml:/traefik.toml
            - ./conf/acme.json:/acme.json
        labels:
            - "traefik.enable=true"
            - "traefik.docker.network=traefik_network"
            - "traefik.port=8080"
            - "traefik.entryPoint=https"
            - "traefik.backend=traefik"
            - "traefik.frontend.rule=Host:traefik.monsite.co"
        networks:
            - traefik_network


networks:
    traefik_network:
        external: true

Je rajoute deux fichiers dans un dossier conf/ :

  • traefik.toml qui va contenir la configuration de Traefik
  • acme.json qui va contenir les clés SSL

La configuration de mon fichier traefik.toml :

debug = false

logLevel = "INFO"
defaultEntryPoints = ["https", "http"]

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
      entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "monsite.co"
watch = true
exposedByDefault = false

[acme]
email = "contact@monsite.co"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
  entryPoint = "http"
  • [entryPoints] va définir HTTP et HTTPS comme points d'entrée du site (avec une redirection du HTTP vers le HTTPS).
  • [docker] va définir les règles de découverte des containers Docker.
  • [acme] va définir les règles de génération des certificats SSL pour les domaines et sous-domaines définis dans [[acme.domains]]

Le fichier acme.json, quant à lui, va rester vide. Il sera rempli par Traefik directement sur le serveur lorsqu'il générera les certificats SSL pour les domaines et sous-domaines.

Une fois ce code déployé sur le serveur, je démarre mon Docker Compose pour lancer Traefik.

Pour ouvrir un container à Internet, il suffit juste de rajouter quelques lignes de configuration dans le fichier docker-compose.yml du projet.

Dans un premier temps, j'y déclare l'external network utilisé par Traefik :

[…]
networks:
    traefik_network:
        external: true

Puis , je rajoute ces lignes aux containers que je souhaite dévoiler :

    […]
    networks:
        - traefik_network

Je rajoute également quelques lignes de configuration que Traefik utilisera :

    […]
    labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik_network"
        - "traefik.port=2368"
        - "traefik.entryPoint=https"
        - "traefik.backend=ghost"
        - "traefik.frontend.rule=Host:monsite.co"
  • traefik.enable : rend le container disponible pour Traefik
  • traefik.docker.network : défini le network utilisé par Traefik
  • traefik.port : défini le port de sortie du container qui doit être ouvert à Internet
  • traefik.entryPoint : "http" ou "https"
  • traefik.backend : le nom du backend (utilisé dans la webapp de Traefik)
  • traefik.frontend.rule : le domaine ou le sous-domaine qui pointe vers ce container

Une fois le Docker Compose du projet lancé, le container apparaitra sur l'external network qui sera dévoilé sur Internet par Traefik. C'est aussi simple que ça.

Petit bonus : Traefik propose également une "interface d'administration" (très légère) qui va afficher les backends et frontends détectés et pris en charge par le service.

La documentation complète pour Traefik se trouve là : https://docs.traefik.io.

Disclamer : les codes partagés ci-dessus correspondent à mes besoins et doivent être adaptés en fonction du projet.