web-dev-qa-db-fra.com

Traefik> "Bad gateway" (erreur 502) pour certains conteneurs

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 !!! :)

3
Alextoch

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
14
BMitch

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.

0
Ryan