问题描述
我要下一个端口转发:
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”:
http://localhost:8070/
-> "Hello-Word"
在这种情况下,它不会通过 Traefik 路由,而是直接通过 api-service。是否可以通过 Traefik 实现?
解决方法
要让 traefik 使用 docker 路由服务,您应该有标签。 Traefik 将获取这些标签以了解如何进行路由。
因此,要将 api.service.localhost
的请求路由到您的 api 服务,您应该具有定义相应 rule 的标签:
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
(更多帮助以公开仪表板 here)。
注意,如果您的 api 服务使用默认端口以外的端口,您可以添加此标签:
traefik.http.services.service.loadbalancer.server.port=80
Ps,不要暴露两次80端口,你只需要暴露给traefik容器即可。