web-dev-qa-db-ja.com

Traefik>一部のコンテナの「悪いゲートウェイ」(エラー502)

Dockerでtraefikを使用する際にいくつかの問題に遭遇しましたが、その理由はわかりません。

一部のコンテナでは、チャームのように機能しますが、他のコンテナでは、これらのコンテナにアクセスしようとするとエラーが発生します:不正なゲートウェイ(エラー502)。

これが私の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"]

ここに私のdocker-compose.yml(portainerの場合、これは機能するコンテナーです):

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

Docker.domain.tldにアクセスすると動作します!そして、httpsで、valideで証明書を暗号化しましょう:)

これが私のdocker-compose.ymlです(動作しないコンテナであるdokuwikiの場合):

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

Wiki.domain.tldにアクセスすると、機能しません!ブラウザに不正なゲートウェイエラーがあります。 traefik.portを7443に、traefik.default.protocolをhttpsに変更しようとしましたが、同じエラーが発生します。もちろん、IPとポート(http/https)を使用してwikiにアクセスしようとすると機能します。 wiki.domain.tldと入力したときのみ、ゲートウェイが正しくありません。

したがって、同じ宣言を持つ他のコンテナではなく、いくつかのコンテナで機能する理由がわかりません。

9
Alextoch

Traefikポートは、ホストの公開ポートではなく、コンテナのhttpポートである必要があります。 Dockerネットワークを介して通信するため、ポートの公開は不要であり、すべてのコンテナにアクセスするためにリバースプロキシで公開される単一のポートのみを持つという目標に反します。

要するに、次のものが必要です。

traefik.port=80

この質問には多くの意見が寄せられているため、多くの人々がtraefikから502を見る他の理由は、traefikインスタンスとは異なるドッカーネットワークにコンテナを配置するか、複数のネットワークにコンテナを持ち、どのネットワークを使用するかをtraefikに伝えないことです。作成ファイルには、traefikサービスのネットワークと一致する次の行があるため、これは当てはまりません。

services:
  dokuwiki:
    networks:
      - traefik-network
    labels:
      - traefik.docker.network=traefik-network
networks:
  traefik-network:
    external : true

サービスを単一のネットワークにのみ割り当てた場合でも、ポートの公開などのアクションにより、サービスが2つの異なるネットワークに接続されます(2番目の入口ネットワーク)。ラベル内のネットワーク名は外部名である必要がありますが、これは同じ場合ですが、ネットワークを外部として指定しない他の場合は、docker network ls出力。

25
BMitch

traefik.docker.networkは完全修飾ネットワーク名でもある必要があります。外部で定義されているか、スタック名のプレフィックスが付いています。

または、docker.network=traefik-networkを使用してデフォルトのネットワークを定義できます。これは、すべてのコンテナにラベルを追加する必要がないことを意味します。

0
Ryan