使用Traefik代理在同一服务器部署两个独立子域名服务
解决Traefik路由504网关超时问题
你的配置存在几个关键问题导致了504错误,修复后的完整Docker Compose配置如下:
version: '3' services: traefik: image: traefik:latest restart: always command: - --accesslog - --api.insecure=true - --providers.docker - --providers.docker.exposedbydefault=false volumes: - /var/run/docker.sock:/var/run/docker.sock ports: - "80:80" - "8080:8080" networks: - fullstack # 让Traefik加入服务所在的自定义网络 service1: image: ghcr.io/user/service1:latest restart: always # 移除宿主机端口映射,Traefik通过内部网络访问服务 networks: - fullstack labels: - traefik.enable=true - traefik.http.routers.service1.rule=Host(`service1.domain.com`) # 指定转发到服务内部的8080端口 - traefik.http.services.service1.loadbalancer.server.port=8080 service2: image: ghcr.io/user/service2:latest # 修正镜像名称拼写错误 restart: always # 移除宿主机端口映射 labels: - traefik.enable=true - traefik.http.routers.service2.rule=Host(`service2.domain.com`) - traefik.http.services.service2.loadbalancer.server.port=8080 networks: - fullstack networks: fullstack: driver: bridge
关键修改说明:
- Traefik加入自定义网络:原配置中Traefik默认使用Docker默认网络,而你的服务在
fullstack自定义网络内,跨网络无法通信,必须将Traefik也加入该网络。 - 移除宿主机端口映射:服务不需要暴露8081、8082到宿主机,Traefik通过Docker内部网络直接访问服务的8080端口,暴露外部端口无必要且存在安全隐患。
- 添加服务端口指定标签:Traefik需要明确知道请求要转发到服务的哪个端口,因此需添加
traefik.http.services.xxx.loadbalancer.server.port=8080标签,对应服务内部监听的8080端口。 - 修正镜像名称拼写错误:service2的镜像名原配置写成了
serice2,改为正确的service2避免镜像拉取失败。
重启Docker Compose后,访问service1.domain.com和service2.domain.com即可正常路由到对应服务。
内容的提问来源于stack exchange,提问作者themiDdlest
相关产品推荐
相关产品推荐

