首页 > 解决方案 > 使用 Traefik 和 docker-compose 的端口转发问题

问题描述

我想要下一个端口转发:

http://traefik.service.localhost/->Traefik UI

http://api.service.localhost/->'Hello-Word' page from api-service

这是我尝试创建适当的 docker-compose.yml文件:

version: '3.8'

services:

  reverse-proxy:
    image: traefik:v2.4
    container_name: reverse-proxy
    command: 
      - "--api.insecure=true"
      - "--providers.docker"
    ports:
      - "80:80"
      - "8080:8080"
    labels:
      - traefik.enable=true
      - traefik.docker.network=pred-network
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - pred-network


  api-service:
    image: x86_64/prediction-service:0.8.1
    container_name: api-service
    environment:
      SERVING_SERVICE: model-service
    expose:
      - 80
    labels:
      - traefik.enable=true
      - traefik.http.routers.api-service.rule=Host(`api.service.localhost`)
    networks:
      - pred-network

networks:
  pred-network:

我得到以下信息:

http://traefik.service.localhost/->HTTP Error 404. The requested resource is not found.

http://api.service.localhost/->HTTP Error 404. The requested resource is not found.

唯一有效的链接:

http://api.service.localhost:8080/->Traefik UI

如果我包括:

ports:
  - "8070:80"

进入docker-compose.yml的api-service部分,我可以访问我的“Hello-Word”: -> 在这种情况下,它不会通过 Traefik 路由,而是直接通过api-service路由。是否可以通过 Traefik 做到这一点?http://localhost:8070/"Hello-Word"

标签: docker-composeproxyportreverse-proxytraefik

解决方案


要让 traefik 使用 docker 路由服务,您应该有标签。Traefik 将获取这些标签以了解如何进行路由。

因此,要将请求api.service.localhost路由到您的 api 服务,您应该具有定义相应规则的标签:

traefik.http.routers.service.rule=Host(`api.service.localhost`)

至于 Traefik 的标签,你应该有两个标签:

traefik.http.routers.traefik.rule=Host(`traefik.service.localhost`)
traefik.http.routers.traefik.service=api@internal

除了这些 traefik 标签,您应该告诉 traefik 通过添加此配置使用特定服务公开仪表板:(在此处--api.dashboard公开仪表板的更多帮助)。

注意,如果您的 api 服务默认使用另一个端口,您可以添加此标签:

traefik.http.services.service.loadbalancer.server.port=80 

ps,不要暴露两次80端口,只需要为traefik容器暴露即可。


推荐阅读