Une infra rapide avec Docker et Traefik

Avant l'avènement des conteneurs, il arrivait d'utiliser une machine entière (ou VM) pour faire un site web. Lorsqu'on avait plusieurs sites sur une machine  il fallait faire un reverse-proxy avec généralement Apache, NGINX ou HAProxy pour faire quelque chose de "propre"...Avec l'arrivée de Docker,  beaucoup de choses ont changées. Il est possible d'avoir plusieurs  instances MySQL sur une seule machine par exemple. Fini donc les bases de données  partagées. De même pour les serveurs web. Mais pour ce qui est du  reverse-proxy, Apache, NGINX et HAProxy sont restés très en vogue. Pourtant, une solution commence à montrer le bout de son nez : Traefik. Et ça change pas mal de choses...


Traefik, le reverse-proxy dockerisé

Alors oui, il est possible de dockeriser un reverse-proxy Apache ou NGINX mais non sans douleur avec les configurations. Avec Traefik arrive un support de Docker (ainsi que Swarm, Kubernetes, Mesos et la liste est longue...). Cela change pas mal de choses. Grâce à très peu de configuration (2 fichiers si on compte docker-compose.yml), on peut déployer rapidement une infra sans trop encrasser la machine hôte.

traefik-architecture-1-

Le fonctionnement de Traefik.

Preuve par l'exemple

Rien de plus concret qu'un exemple pour comprendre la simplicité et surtout l'avantage de cette combinaison.

Dans notre exemple, nous allons définir le besoin d'un développeur qui a besoin d'une présence sur le web, d'un endroit où stocker ses projets et un blog pour rédiger des articles sur son travail...
Déjà vu ? En effet, c'est ce que j'utilise pour ma propre infrastructure... Nous allons donc voir comment déployer le système de blogging Ghost et le dépôt de code Gitea sur un VPS entré de gamme.

Première étape : le nom de domaine et la machine.

Bon sur cette partie on ne va pas s'étendre trop longtemps. Il suffit de louer un petit serveur (type VPS) le tout sous Debian Linux. Puis son nom de domaine et de le faire pointer sur l'adresse IP du VPS... Au passage on en profite pour mettre dans les enregistrements DNS notre sous-domaine "git" pour le Gitea. Rien de bien compliqué.

Deuxième étape : Get Docker and Docker Compose.

Pareil ici, je ne vais pas détailler comment installer Docker car la documentation officielle est assez bien expliquée : https://docs.docker.com/install/linux/docker-ce/debian/#prerequisites
De même pour docker Compose : http://docs.docker.com/compose/install/

Troisième étape : Docker-compose.yml et traefik.toml

Voici donc le moment où l'on va creer les deux fichiers de configurations pour TOUTE notre infra. Rien que ça...
Voici le docker-compose.yml :

version: '3'

services:
  proxy:
    image: traefik:1.7
    restart: always
    command: --docker --docker.domain=mon-domain.com --logLevel="ERROR"
    networks:
      - traefik
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/traefik/conf/traefik.toml:/treafik.toml
      - /var/traefik/acme/acme.json:/acme.json
  git:
    image: gitea/gitea:latest
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    ports:
      - 2222:22
    networks:
      - traefik
    volumes:
      - /var/gitea:/data
    labels:
      - "traefik.port=3000"
      - "traefik.frontend.rule=Host:git.mon-domain.com"
  
  ghost:
    image: ghost:2-alpine
    restart: always
    environment:
      - database_client="mysql"
      - database_connection_host="db_ghost"
      - database_connection_user="root"
      - database_connection_password="example"
      - database_connection_database="ghost"
      - url="https://mon-domain.com"
    labels:
      - "traefik.port=2368"
      - "traefik.frontend.rule=Host:mon-domaine.com"
  db_ghost:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD="example"

Et maintenant le traefik.toml :

defaultEntryPoints = ["http", "https"]

[docker]
domain = "mon-domaine.com"
watch = true

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
       minVersion = "VersionTLS12"
       cipherSuites = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"]

[acme]
email = "mon-email@example.com"
storage = "acme.json"
entryPoint = "https"
[acme.httpChallenge]
  entryPoint = "http"
onHostRule = true
[[acme.domains]]
  main = "mon-domain.com"
[[acme.domains]]
  main = "git.mon-domaine.com"

Maintenant que mes fichiers de config sont prêts, j'ai juste à lancer une commande:

docker-compose up -d

Et toute l'infra est créée en moins de 30 secondes (un peu plus,~5 min, si il faut récupérer les images des conteneurs). Il me reste plus qu'à aller finir de configurer Ghost et Gitea en me rendant sur leurs URL respectives.

Le plus pratique avec cette infra c'est qu'elle peut être modifiée rapidement pour etre déployée ailleurs, comme un environnement de test local, interne ou autre. Elle peut aussi être rapidement modifié pour ajouter des nouveaux services, et ce, sans avoir de coupures sur le reste des services !De plus, chaque service étant isolé dans des conteneurs, impossible d'avoir des conflits.