【问题标题】:Traefik with docker backend leads to bad gateway带有 docker 后端的 Traefik 导致网关错误
【发布时间】:2017-09-21 13:43:14
【问题描述】:

我设置了一个安装了 docker 和 docker-compose 的 debian 服务器。

我在我的 sudo 用户的家中创建了一个具有以下层次结构的文件夹:

~/docker-project
      - docker-compose.yml
      - /traefik/traefik.toml

我做了一个docker-compose up -d,一切都开始了,我可以访问 traefik.mydomain.com,它与其他子域一样具有有效的 ssl 证书。但是,如果我去我的任何子域访问我的 dockerized web 服务,我会在浏览器中收到 bad gateway 消息。如果我转到我的服务器 IP 地址并输入正确的端口,我会看到我的网络服务运行良好。

所以我认为我在配置 docker / traefik 关系时犯了一个错误,但我找不到在哪里。

这是我的traefik.toml:

defaultEntryPoints = ["http", "https"]

################################################################
# Web configuration backend
################################################################
[web]
address = ":8080"
[web.auth.basic]
# User: user | Password: password
users = ["user:hashedpassword"]

################################################################
# 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 = "mydomain.com"
watch = true
exposedbydefault = false

################################################################
# Let's encrypt
################################################################
[acme]
email = "my-email@mail.com"
storageFile = "/etc/traefik/acme.json"
onDemand = false
onHostRule = true
entryPoint = "https"

这是我的docker-compose.yml:

version: '2'
services:

  traefik:
    restart: always
    image: traefik
    container_name: traefik
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=dockerplatform_default'
      - 'traefik.port=8080'
      - 'traefik.frontend.rule=Host:traefik.mydomain.com'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik:/etc/traefik

  plex:
    image: linuxserver/plex
    container_name: plex
    environment:
      - VERSION=latest
      - PUID=1000
      - PGID=1000
      - TZ=TZ
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=dockerplatform_default'
      - 'traefik.port=9001'
      - 'traefik.frontend.rule=Host:plex.mydomain.com' 
    ports:
      - '9001:32400'
    volumes:
      - 'plex:/config'
      - 'plex_transcode:/transcode'
      - '/home/downloader/Downloads:/data/'

  plexpy:
    image: linuxserver/plexpy
    container_name: plexpy
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=TZ
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=dockerplatform_default'
      - 'traefik.port=9002'
      - 'traefik.frontend.rule=Host:plexpy.mydomain.com' 
    ports:
      - '9002:8181'
    volumes:
      - 'plexpy:/config'

  transmission:
    image: linuxserver/transmission
    container_name: transmission
    environment:
      - PGID=1000
      - PUID=1000
      - TZ=TZ
    labels:
      - 'traefik.enable=true'
      - 'traefik.docker.network=dockerplatform_default'
      - 'traefik.port=9003'
      - 'traefik.frontend.rule=Host:bt.mydomain.com' 
    ports:
      - '9003:9091'
      - '51413:51413'
      - '51413:51413/udp'
    volumes:
      - 'transmission:/config'
      - '/home/downloader/Downloads:/downloads'
      - '/home/downloader/Downloads:/watch'

volumes:
  plex:
    driver: local
  plex_transcode:
    driver: local
  plexpy:
    driver: local
  transmission:
    driver: local

感谢您的帮助。

【问题讨论】:

    标签: docker docker-compose traefik


    【解决方案1】:

    多亏了很棒的 traefik slack 频道,我设法得到了答案!

    所以我的容器都在同一个 docker 网络中,包括我的 traefik 容器。

    问题是我将所有容器端口映射为可从主机访问。

    相反,我应该只将 traefik 端口映射到主机并公开我的 Web 服务容器的端口,以便 traefik 可以在它们所在的 docker 网络中监听它们。

    更改:- 添加公开 - 更改 traefik.port

    我只需要在我的 docker-compose.yml 中进行这些更改:

    version: '2'
    services:
    
      traefik:
        restart: always
        image: traefik
        container_name: traefik
        ports:
          - '80:80'
          - '443:443'
          - '8080:8080'
        labels:
          - 'traefik.enable=true'
          - 'traefik.docker.network=dockerplatform_default'
          - 'traefik.port=8080'
          - 'traefik.frontend.rule=Host:traefik.mydomain.com'
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - ./traefik:/etc/traefik
    
      plex:
        image: linuxserver/plex
        container_name: plex
        environment:
          - VERSION=latest
          - PUID=1000
          - PGID=1000
          - TZ=TZ
        labels:
          - 'traefik.enable=true'
          - 'traefik.docker.network=dockerplatform_default'
          - 'traefik.port=32400'
          - 'traefik.frontend.rule=Host:plex.mydomain.com' 
        #ports:
        #  - '9001:32400'
        expose:
          - 32400
        volumes:
          - 'plex:/config'
          - 'plex_transcode:/transcode'
          - '/home/downloader/Downloads:/data/'
    
      plexpy:
        image: linuxserver/plexpy
        container_name: plexpy
        environment:
          - PUID=1000
          - PGID=1000
          - TZ=TZ
        labels:
          - 'traefik.enable=true'
          - 'traefik.docker.network=dockerplatform_default'
          - 'traefik.port=8181'
          - 'traefik.frontend.rule=Host:plexpy.mydomain.com' 
        #ports:
        #  - '9002:8181'
        expose:
          - 8181
        volumes:
          - 'plexpy:/config'
    
      transmission:
        image: linuxserver/transmission
        container_name: transmission
        environment:
          - PGID=1000
          - PUID=1000
          - TZ=TZ
        labels:
          - 'traefik.enable=true'
          - 'traefik.docker.network=dockerplatform_default'
          - 'traefik.port=9091'
          - 'traefik.frontend.rule=Host:bt.mydomain.com' 
        #ports:
        #  - '9003:9091'
        #  - '51413:51413'
        #  - '51413:51413/udp'
        expose:
          - 9091
          - 51413
        volumes:
          - 'transmission:/config'
          - '/home/downloader/Downloads:/downloads'
          - '/home/downloader/Downloads:/watch'
    
    volumes:
      plex:
        driver: local
      plex_transcode:
        driver: local
      plexpy:
        driver: local
      transmission:
        driver: local
    

    【讨论】:

    • 我还将流量重定向到 localhost,而不是将其映射到容器共享的 docker 网络。你救了我很多。谢谢。
    【解决方案2】:

    由于 Traefik v2 现已推出,这个问题值得更新:

    • 不再需要expose 端口定义。
    • 既不是该容器的port 映射定义。
    • 唯一需要的是,容器中的某些东西正在监听。

    注意: 如果您定义为例如一个 Nginx 容器,添加标签 - 'traefik.port=9091' 还要添加一个监听端口9091的服务器配置。

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 2019-08-19
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2022-12-23
      • 2018-11-04
      相关资源
      最近更新 更多