Traefik 将一个应用程序路由到端口 80,其他应用程序需要显式端口

Traefik routing one application to port 80, others require explicit port

我有一个环境 运行 docker 容器。 此环境托管 Traefik、Nextcloud、MotionEye 和 Heimdall。 我在 docker 容器中还有另一个环境 运行 CoreDNS。 出于某种原因,我可以从 motioneye.docker.swarm 访问 MotionEye(为了隐私更改了此处的域)。 但是,对于 nextcloud 和 Heimdall,我必须明确访问这些端口,而且我很难说出原因。 例如Heimdall 是 gateway.docker.swarm:8091 而应该是 gateway.docker.swarm

当用户向本地 dns 服务器 X.X.X.117 请求网页时,它会被路由到 X.X.X.106.

上的 traefik 实例

我的traefik compose文件如下:

version: '3'

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.3
    restart: always
    # Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.port=8080"
      - "traefik.backend=traefik"
      - "traefik.frontend.rule=Host:traefik.docker.swarm"
      - "traefik.docker.network=traefik_default"

我的海姆达尔作文如下:

version: "3"
services:
  heimdall:
    image: ghcr.io/linuxserver/heimdall
    container_name: heimdall
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
    volumes:
      - /home/pi/heimdall/config:/config
    ports:
      - 8091:80
    restart: unless-stopped
    networks:
      - heimdall
    labels:
      - "traefik.enable=true"
      - "traefik.port=8091"
      - "traefik.http.routers.heimdall.entrypoints=http"
      - "traefik.http.routers.heimdall.rule=Host(`gateway.docker.swarm`)"
networks:
  heimdall:
    external:
      name: heimdall

谁能看出我做错了什么?

当您通过 gateway.docker.swarm:8091 访问时,它会起作用,因为您正在直接访问 heimdall 容器。这是可能的,因为你定义了

ports:
  - 8091:80

在你的 docker-compose.

为了通过 traefik 访问,它们必须在同一网络上。此外,如果您希望此容器只能通过 traefik 访问,请删除端口映射。最后相应地更正 traefik 端口。

version: "3"
services:
  heimdall:
    image: ghcr.io/linuxserver/heimdall
    container_name: heimdall
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
    volumes:
      - /home/pi/heimdall/config:/config
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.port=80"
      - "traefik.http.routers.heimdall.entrypoints=http"
      - "traefik.http.routers.heimdall.rule=Host(`gateway.docker.swarm`)"