无法使用Traefik为React天气应用实现HTTP域名路由
问题排查与修复方案
核心问题
你的whoami、nginx能正常通过Traefik路由,是因为它们默认监听容器内的80端口,Traefik会自动探测这个端口;但React天气应用用的是3000端口,Traefik没法自动识别,导致请求转发失败。另外还要确认应用是否监听容器的所有网卡(0.0.0.0),不然Traefik连不上容器里的服务。
具体修复步骤
1. 给Traefik添加端口转发配置
在weather服务的labels里新增两行配置,明确告诉Traefik把请求转发到容器的3000端口:
labels: - "traefik.enable=true" - "traefik.docker.network=traefik-public" - "traefik.http.routers.weather.rule=Host(`weather.localhost`)" - "traefik.http.routers.weather.entrypoints=web" # 新增以下两行 - "traefik.http.services.weather.loadbalancer.server.port=3000" - "traefik.http.services.weather.loadbalancer.server.scheme=http"
2. 确保React应用监听0.0.0.0
默认情况下React开发服务器只监听127.0.0.1,容器外部(包括Traefik)无法访问。修改package.json的start脚本:
"scripts": { "start": "HOST=0.0.0.0 PORT=3000 react-scripts start" }
或者在Dockerfile中添加环境变量:
ENV HOST 0.0.0.0 ENV PORT 3000
3. 移除不必要的端口映射(可选)
Swarm模式下Traefik通过内部网络与服务通信,不需要将容器的3000端口映射到主机,直接删除weather服务中的ports: - 3000:3000配置,避免端口冲突。
4. 重新部署服务
更新配置后重新部署Swarm服务:
docker stack deploy -c docker-compose.yml <你的栈名称>
5. 验证Traefik路由状态
打开Traefik的dashboard(localhost:8080),查看weather路由和服务是否正常注册,确认没有错误提示。
额外检查点
- 确认
traefik-public网络在Swarm中存在,且所有服务都正确加入该网络 - 查看Traefik日志排查连接错误:
docker service logs <traefik服务名称>
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

