Créer son site web sous Docker - Etape 1 - Les fondations avec Traefik, Portainer et Watchtower

Créer son site web sous Docker - Etape 1 - Les fondations avec Traefik, Portainer et Watchtower

Créer son site web sous Docker - Etape 1 - Les fondations avec Traefik, Portainer et Watchtower

Bonjour,

Les prérequis pour ce guide sont les suivants:

1. Avoir installé Proxmox et votre VM (optionnel)

2.  Avoir installé Ubuntu (ou équivalent).

3. Avoir installé Docker & Docker Compose.

On va commencer par créer ce que j’appelle les fondations. Je divise mes installations sous docker en général en 3 stacks différents : le stack des fondations ou j’installe le reverse proxy et tout ce qui est lié au management des containers, ensuite le stack principal et un dernier stack qui concerne le monitoring. Ca me permet de faire des mises à jour simples quand je veux modifier des choses sur mon stack et normalement de ne quasi jamais toucher à mon stack principal. Si vous souhaitez tout regrouper dans un seul fichier docker-compose ça fonctionne parfaitement. Ah oui, et on va effectivement tout faire à partir des fichiers docker-compose, c’est parfait pour la maintenance et les upgrades, beaucoup mieux que de lancer les conteneurs à base de lignes de commandes.

4. On va maintenant créer deux networks virtuels pour le reverse proxy : un qui sera « en contact » avec l’extérieur de votre réseau et l’autre qui sera « interne » à votre réseau local. On se connecte en SSH sur son serveur et let’s rock :

docker network create frontend
docker network create backend

5. On va maintenant créer le docker-compose qui va bien:

mkdir traefik
cd traefik
nano docker-compose.yml

Et donc le fichier en lui même:


version: '3.5'
services:
  # Traefik is a reverse proxy. It handles SSL and passes traffic to Docker containers via rules you define in docker-compose labels.
  # Le dashboard est a l'adresse http://example.com/traefik/ (behind a login).
  traefik:
  # https://hub.docker.com/_/traefik/
  image: traefik:1.7.16
  command: --api --docker --acme.email="votreemail"
  restart: unless-stopped
  container_name: traefik
  networks:
    - backend
    - frontend
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock # Access to Docker
    - ./traefik.toml:/traefik.toml # Traefik configuration
    - ./acme.json:/acme.json # SSL certificates
  ports:
    - "80:80"
    - "8080:8080"
    - "443:443"
  labels:
    - "traefik.docker.network=frontend"
    - "traefik.enable=true"
    - "traefik.frontend.rule=Host:votresiteweb.com; PathPrefixStrip:/traefik"
    - "traefik.port=8080"
    # - "traefik.protocol=http"
    - "traefik.entryPoints=http,https"
    # Remove next line to disable login prompt for the dashboard.
    - "traefik.frontend.auth.basic=votrepseudo:votrepassword"
    - "traefik.backend=traefik"

  # Installer Portainer / Interface graphique docker
  # https://hub.docker.com/r/portainer/portainer
  portainer:
  image: portainer/portainer:latest
  container_name: portainer
  restart: unless-stopped
  networks:
    - backend
  ports:
    - "9000:9000"
  labels:
    - "traefik.enable=false"
  volumes:
    - "/var/run/docker.sock:/var/run/docker.sock"
    - ./data:/data

  # Watchtower detects if any linked containers have an new image available, automatically updating & restarting them if needed.
  watchtower:
  # https://hub.docker.com/r/centurylink/watchtower/
  image: v2tec/watchtower:latest
  # https://github.com/v2tec/watchtower#options
  # This schedule applies updates (if available) at midnight.
  command: --cleanup --schedule "0 0 0 * * *"
  depends_on:
    - traefik
  restart: unless-stopped
  container_name: watchtower
  networks:
    - backend
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  labels:
    - "traefik.enable=false"

networks:
  frontend:
    external: true
  backend:
    external: true

Alors les explications :

  •  Traefik c’est votre reverse proxy qui va vous permettre de gérer le trafic qui passe dans vos différents containers et les certificats SSL. A noter que dans ce guide je tourne encore avec Traefik 1.7 et non la version 2.x.
  • Portainer va vous permettre de gérer les containers docker via une interface graphique (pratique pour aller voir rapidement les logs, les arrêter, redémarrer, etc…) sans ligne de commande.
  • Watchtower va bosser comme un grand en tâche de fond et va mettre à jour automatiquement vos containers tous les jours à minuit. Il va vérifier si il existe une nouvelle image et si c’est le cas, la pull et relancer automatiquement le container. Génial pour vous assurer d’être tout le temps à jour mais il faut faire attention car des fois certaines mises à jour peuvent « casser » votre installation.

6- On enregistre le magnifique (ctrl +x si vous utilisez nano) docker-compose et on va créer maintenant les fichiers qui sont nécessaires au bon fonctionnement de traefik. On commence par créer le fichier acme.json pour le certificat SSL:

touch acme.json && chmod 600 acme.json

7- On va maintenant créer le fichier traefik.toml qui va indiquer à traefik la façon dont il doit gérer les flux http et https:

nano traefik.toml

On rentre les infos suivantes dans le fichier:


# Traefik will listen for traffic on both HTTP and HTTPS.
defaultEntryPoints = ["http", "https"]

# Network traffic will be entering our Docker network on the usual web ports
# (ie, 80 and 443), where Traefik will be listening.
[entryPoints]
  [entryPoints.http]
  address = ":80"
  # Comment out the following two lines to redirect HTTP to HTTPS.
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

# These options are for Traefik's integration with Docker.
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "docker.localhost" 
watch = true
exposedByDefault = false

# These options are for Traefik's integration with Let's Encrypt.
# Your certificates are stored inside /acme.json inside the container,
# which is /root/compose/acme.json on your server.
[acme]
storage = "acme.json"
onHostRule = true
entryPoint = "https"
  [acme.httpChallenge]
  entryPoint = "http"
[[acme.domains]]
  main = "votredomaine.com"
  sans = ["blabla.votredomaine.com"]

# https://docs.traefik.io/configuration/logs/
# Comment out the next line to enable Traefik's access logs.
# [accessLog]

# Pour modifier l'api
[api]

8- On enregistre le fichier et on va maintenant pouvoir lancer les containers:

docker-compose up -d --build

9- Si vous n’avez pas fait d’erreur l’interface de traefik sera disponible sur http://votreiplocale:8080 ou alors https://votredomaine.com/traefik, et l’interface de portainer sera disponible sur http://votreiplocale:9000

10- A noter que le password qui est demandé pour l’interface de traefik doit être généré avec htpasswd generator. Pour ça on peut le faire soit avec une ligne de commande soit aller directement sur un site: http://www.htaccesstools.com/htpasswd-generator/. A savoir que dès qu’il y a un sigle $ il faut en rajouter un deuxième sinon docker-compose ne le prend pas en compte. C’est un peu bordélique je vous l’accorde.

On a crée les fondations pour la construction de votre site web. Il ne nous reste plus qu’à créer le site web en lui même ! C’est ce qu’on verra dans le prochain guide.

@+