使用 traefik 和 docker-compose 进行端口转发
Port forwarding with traefik and docker-compose
我想通过带端口转发的 traefik 提供 docker-compose 服务。我尝试了很多次,现在我能达到的最好成绩如下所述:
首先我创建两个网络:
docker network create frontend # To expose traefik
docker network create backend # To bind backend services
traefik 配置是关于(开发,在 :8080
启用仪表板):
version: "3.6"
services:
proxy:
image: traefik:latest
restart: unless-stopped
command:
- "--log.level=DEBUG"
- "--api"
- "--api.dashboard"
- "--api.insecure"
- "--providers.docker"
- "--providers.docker.exposedbydefault=false"
# Service entrypoint:
- "--entrypoints.lora-server.address=:8090"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
- "traefik.enable=true"
- "traefik.docker.network=frontend"
- "traefik.http.routers.traefik.entrypoints=traefik"
- "traefik.http.routers.traefik.service=api@internal"
networks:
- backend
- frontend
ports:
- "8080:8080"
- "8090:8090"
networks:
frontend:
external: true
backend:
external: true
此处描述了后端服务(来自 ChripStack 的分支,但也可以是其他任何内容):
version: "3"
services:
# [...]
chirpstack-application-server:
image: chirpstack/chirpstack-application-server:3
networks:
- backend
volumes:
- ./configuration/chirpstack-application-server:/etc/chirpstack-application-server
labels:
- "traefik.enable=true"
- "traefik.docker.network=backend"
- "traefik.http.routers.chirpstack.entrypoints=lora-server"
- "traefik.http.routers.chirpstack.rule=Host(`{host:}`)"
- "traefik.http.routers.chirpstack.service=chirpstack-application-server@docker"
- "traefik.http.services.chirpstack-application-server.loadbalancer.server.port=8080"
# [...]
networks:
backend:
external: true
该服务也在 :8080
上本地 运行,我想在 :8090
上通过 traefik 访问它。
当我 运行 这两个应用程序时,traefik 注册了新服务并且没有抱怨(没有错误,没有警告,至少从仪表板界面来看流程似乎是完整的)。
time="2020-07-30T11:47:47Z" level=debug msg="Creating middleware" middlewareType=Pipelining serviceName=chirpstack-application-server@docker entryPointName=lora-server routerName=chirpstack@docker middlewareName=pipelining
time="2020-07-30T11:47:47Z" level=debug msg="Creating load-balancer" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker
time="2020-07-30T11:47:47Z" level=debug msg="Creating server 0 http://192.168.112.9:8080" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker serverName=0
time="2020-07-30T11:47:47Z" level=debug msg="Added outgoing tracing middleware chirpstack-application-server@docker" middlewareName=tracing entryPointName=lora-server routerName=chirpstack@docker middlewareType=TracingForwarder
但是我无法访问该服务,当我尝试连接时出现 404 错误 http://host:8090
。
据我了解,traefik 似乎不知道它应该如何完成两个网络之间的流程:http://frontend:8090 -> http://backend:8080
(因为我没有在任何地方引用它)。
我应该在我的配置中更改什么才能使其工作?我如何指定 traefik 必须将 HTTP 流量从 frontend:8090
路由到 backend:8080
?非常感谢您的帮助。
Traefik 监听某个端口,这是唯一用 entrypoints
定义的东西。您没有为此传入请求指定网络,因为它不相关。 traefik.docker.network
仅用于路由 after Traefik 处理传入请求。
所以正确的流程不是http://frontend:8090 -> http://backend:8080
,而是http://host:8090 -> http://backend:8080
。
我认为你的配置是正确的。唯一奇怪的是 Host
规则的使用。也许尝试将其更改为这样的内容:
"traefik.http.routers.chirpstack.rule=hostregexp(`{host:.+}`)"
我想通过带端口转发的 traefik 提供 docker-compose 服务。我尝试了很多次,现在我能达到的最好成绩如下所述:
首先我创建两个网络:
docker network create frontend # To expose traefik
docker network create backend # To bind backend services
traefik 配置是关于(开发,在 :8080
启用仪表板):
version: "3.6"
services:
proxy:
image: traefik:latest
restart: unless-stopped
command:
- "--log.level=DEBUG"
- "--api"
- "--api.dashboard"
- "--api.insecure"
- "--providers.docker"
- "--providers.docker.exposedbydefault=false"
# Service entrypoint:
- "--entrypoints.lora-server.address=:8090"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
- "traefik.enable=true"
- "traefik.docker.network=frontend"
- "traefik.http.routers.traefik.entrypoints=traefik"
- "traefik.http.routers.traefik.service=api@internal"
networks:
- backend
- frontend
ports:
- "8080:8080"
- "8090:8090"
networks:
frontend:
external: true
backend:
external: true
此处描述了后端服务(来自 ChripStack 的分支,但也可以是其他任何内容):
version: "3"
services:
# [...]
chirpstack-application-server:
image: chirpstack/chirpstack-application-server:3
networks:
- backend
volumes:
- ./configuration/chirpstack-application-server:/etc/chirpstack-application-server
labels:
- "traefik.enable=true"
- "traefik.docker.network=backend"
- "traefik.http.routers.chirpstack.entrypoints=lora-server"
- "traefik.http.routers.chirpstack.rule=Host(`{host:}`)"
- "traefik.http.routers.chirpstack.service=chirpstack-application-server@docker"
- "traefik.http.services.chirpstack-application-server.loadbalancer.server.port=8080"
# [...]
networks:
backend:
external: true
该服务也在 :8080
上本地 运行,我想在 :8090
上通过 traefik 访问它。
当我 运行 这两个应用程序时,traefik 注册了新服务并且没有抱怨(没有错误,没有警告,至少从仪表板界面来看流程似乎是完整的)。
time="2020-07-30T11:47:47Z" level=debug msg="Creating middleware" middlewareType=Pipelining serviceName=chirpstack-application-server@docker entryPointName=lora-server routerName=chirpstack@docker middlewareName=pipelining
time="2020-07-30T11:47:47Z" level=debug msg="Creating load-balancer" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker
time="2020-07-30T11:47:47Z" level=debug msg="Creating server 0 http://192.168.112.9:8080" entryPointName=lora-server routerName=chirpstack@docker serviceName=chirpstack-application-server@docker serverName=0
time="2020-07-30T11:47:47Z" level=debug msg="Added outgoing tracing middleware chirpstack-application-server@docker" middlewareName=tracing entryPointName=lora-server routerName=chirpstack@docker middlewareType=TracingForwarder
但是我无法访问该服务,当我尝试连接时出现 404 错误 http://host:8090
。
据我了解,traefik 似乎不知道它应该如何完成两个网络之间的流程:http://frontend:8090 -> http://backend:8080
(因为我没有在任何地方引用它)。
我应该在我的配置中更改什么才能使其工作?我如何指定 traefik 必须将 HTTP 流量从 frontend:8090
路由到 backend:8080
?非常感谢您的帮助。
Traefik 监听某个端口,这是唯一用 entrypoints
定义的东西。您没有为此传入请求指定网络,因为它不相关。 traefik.docker.network
仅用于路由 after Traefik 处理传入请求。
所以正确的流程不是http://frontend:8090 -> http://backend:8080
,而是http://host:8090 -> http://backend:8080
。
我认为你的配置是正确的。唯一奇怪的是 Host
规则的使用。也许尝试将其更改为这样的内容:
"traefik.http.routers.chirpstack.rule=hostregexp(`{host:.+}`)"