traefik 2.2反向代理https不显示我的容器

时间:2020-03-09 19:01:50

标签: docker docker-compose yaml traefik

我正在docker中使用traefik v2.2设置测试环境。 我使用测试Web容器设置了一个名为traefik的docker网络。 导航到https://test.com可以看到仪表板,但是看不到 当我按规则设置的路径(即https://test.com/myapp)导航到容器时

在仪表板中,状态看起来一切正常,显示myapp容器的内部ip,路由器和https入口点都很好。

如果我转到https://test.com/myapp,则会显示一个自定义的404页面“错误代码说明:404 =没有与给定URI相匹配的内容。” 如果我转到https://test.com/somenonexistantpath,它会显示一条常规404找不到消息

我尝试更改主机规则。我将traefik.docker.network = traefik添加到了容器标签中,以防它们与traefik容器不在同一网络上,并验证了我可以从traefik容器内部到达http://myapp:80。根据traefik v2文档,主机规则看起来正确,因此我想知道是否丢失了任何内容。

我确实进行了测试,将test.com主机规则移至myapp,并且能够到达测试站点,所以看来我缺少了一些带有路径的东西

下面是我的docker-compose文件,配置文件dynamic-traefik.yaml仅包含tls信息

version: '3.3'

networks:
  traefik:
    external: true



services:
  traefik:
    image: traefik:v2.2 #latest pull as of Feb 25, 2020
    container_name: traefik
    restart: always
    networks:
      - traefik
    ports:
      - "443:443"
    volumes:
      - ${PWD}/traefik:/traefik # Traefik static config
      - /var/run/docker.sock:/var/run/docker.sock:ro # SSL Development certificates
    command:
      - "--log.level=DEBUG"
      #- "--accesslog=true"
      - "--api=true"
      - "--api.dashboard=true"
      - "--api.debug=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=traefik"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--providers.docker.watch=true"
      - "--entrypoints.https.address=:443"
         # apparently you still neeed an extra file to specify TLS
      - "--providers.file.filename=/traefik/dynamic-traefik.yaml"
    labels:
      - "traefik.enable=true"
      # Traefik Dashboard
      - "traefik.http.routers.traefik.rule=Host(`test.com`)" #works but only gives you dashboard
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.entrypoints=https"
      - "traefik.http.routers.traefik.tls=true"
      - "traefik.docker.network=traefik"




  myapp:
    image: yeasy/simple-web:latest
    container_name: myapp
    restart: always
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myapp.entrypoints=https"
      - "traefik.http.routers.myapp.rule=Host(`test.com`) && PathPrefix(`/myapp`)"
      - "traefik.http.routers.myapp.service=myapp"
      - "traefik.http.routers.myapp.tls=true"
      - "traefik.http.services.myapp.loadbalancer.server.port=80" #this is needed to point to the correct port on the service container
      - "treafik.docker.network=traefik"

3 个答案:

答案 0 :(得分:0)

您需要指定priority并将其设置为更高的myapp路由器,以便它首先处理

答案 1 :(得分:0)

在最后一行代码中出现拼写错误。

- "treafik.docker.network=traefik"

答案 2 :(得分:0)

第一步,查看服务日志,找出原因 例如:something_traefik.1.3e5t2fvcipex@ip-xx-xxx-xx-21 | 2021/07/15 15:46:14 命令 traefik 错误:无法从标志解码配置:未找到字段,节点:swarmmode \

$docker 服务日志_traefik

第 2 步。使用 traefik v2.x,您需要将 yaml 文件中的“命令”部分更改为如下所示。

命令: --providers.docker=true
- --providers.docker.constraints=Label(traefik.constraint-label, ${DOCKER_STACK})
--providers.docker.exposedByDefault=false
--providers.docker.swarmmode=true
--provider.docker.watch=true
- --api.insecure=true
- --log.level=debug
- --entrypoints.http.address=":xxx"