Je rencontre des problèmes lors de l’utilisation de Traefik avec Docker et je ne sais pas pourquoi.
Avec certains conteneurs, cela fonctionne comme un charme et pour les autres, j'ai une erreur lorsque j'essaie d'accéder à ceux-ci: Mauvaise passerelle (erreur 502).
Voici mon traefik.toml:
# Service logs (here debug mode)
debug = true
logLevel = "DEBUG"
defaultEntryPoints = ["http", "https"]
# Access log
filePath = "/var/log/traefik/access.log"
format = "common"
################################################################
# Web configuration backend
################################################################
[web]
address = ":8080"
################################################################
# Entry-points configuration
################################################################
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
################################################################
# Docker configuration backend
################################################################
[docker]
domain = "domain.tld"
watch = true
exposedbydefault = false
endpoint = "unix:///var/run/docker.sock"
################################################################
# Let's encrypt
################################################################
[acme]
email = "[email protected]"
storageFile = "acme.json"
onDemand = false
onHostRule = true
entryPoint = "https"
[acme.httpChallenge]
entryPoint = "http"
[[acme.domains]]
main = "domain.tld"
sans = ["docker.domain.tld", "traefik.domain.tld", "phpmyadmin.domain.tld", "perso.domain.tld", "muximux.domain.tld", "wekan.domain.tld", "wiki.domain.tld", "cloud.domain.tld", "email.domain.tld"]
Voici mon docker-compose.yml (pour portainer, qui est un conteneur qui fonctionne):
version: '2'
services:
portainer:
restart: always
image: portainer/portainer:latest
container_name: "portainer"
#Automatically choose 'Manage the Docker instance where Portainer is running' by adding <--Host=unix:///var/run/docker.sock> to the command
ports:
- "9000:9000"
networks:
- traefik-network
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ../portainer:/data
labels:
- traefik.enable=true
- traefik.backend=portainer
- traefik.frontend.rule=Host:docker.domain.tld
- traefik.docker.network=traefik-network
- traefik.port=9000
- traefik.default.protocol=http
networks:
traefik-network:
external : true
Si je vais à docker.domain.tld, ça marche! et en https, avec valide chiffrons le certificat :)
Voici mon docker-compose.yml (pour dokuwiki, qui est un conteneur qui ne fonctionne pas):
version: '2'
services:
dokuwiki:
container_name: "dokuwiki"
image: bitnami/dokuwiki:latest
restart: always
volumes:
- ../dokuwiki/data:/bitnami
ports:
- "8085:80"
- "7443:443"
networks:
- traefik-network
labels:
- traefik.backend=dokuwiki
- traefik.docker.network=traefik-network
- traefik.frontend.rule=Host:wiki.domain.tld
- traefik.enable=true
- traefik.port=8085
- traefik.default.protocol=http
networks:
traefik-network:
external: true
Si je vais sur wiki.domain.tld, ça ne marche pas! J'ai une mauvaise erreur de passerelle sur le navigateur. J'ai essayé de changer le traefik.port à 7443 et le traefik.default.protocol à https mais j'ai la même erreur ... Bien sûr, cela fonctionne lorsque j'essaie d'accéder au wiki avec l'IP et le port (en http/https). J'ai une mauvaise passerelle seulement quand je tape wiki.domain.tld.
Donc, je ne comprends pas pourquoi cela fonctionne pour certains conteneurs et pas pour d'autres avec la même déclaration.
Pourriez-vous m'aider ? Avez-vous une idée ?
Merci beaucoup d'avance !!! :)
Le port traefik doit être le port http du conteneur, et non le port publié sur l'hôte. Il communique sur le réseau de docker, ce qui rend inutile la publication du port, qui n'a pas pour objectif de publier un seul port avec un proxy inverse pour accéder à tous les conteneurs.
En bref, vous avez besoin de:
traefik.port=80
traefik.docker.network
doit également être le nom de réseau qualifié complet. Défini de manière externe ou préfixé avec le nom de la pile.
Vous pouvez également définir un réseau par défaut avec docker.network=traefik-network
, ce qui signifie que vous n'avez pas besoin d'ajouter l'étiquette à chaque conteneur.