Traefik Docker代理问题:无法修改PHP-Apache监听端口
问题分析与解决方案
核心问题是混淆了Docker端口映射和容器内部端口的区别:Traefik与你的服务容器在同一个proxy Docker网络中,它直接访问的是容器内部的端口,而非主机上映射的端口。
正确配置
保留容器内部的80端口作为Traefik的目标端口,同时可以保留主机的9999端口映射(用于本地测试),修改后的docker-compose.yml如下:
version: "3.8" services: resumecv: image: sineverba/resumecv-backend:0.1.0-dev container_name: resumecv networks: - proxy ports: - "9999:80" # 主机端口映射,仅用于本地测试 labels: - "traefik.enable=true" - "traefik.docker.network=proxy" - "traefik.http.routers.resumecv-backend.entrypoints=websecure" - "traefik.http.routers.resumecv-backend.service=resumecv-backend" - "traefik.http.routers.resumecv-backend.rule=Host(`resumecvbackend.example.com`)" - "traefik.http.services.resumecv-backend.loadbalancer.server.port=80" # 指向容器内部的Apache端口 networks: proxy: external: true
原因解释
ports: - "9999:80"是将主机的9999端口转发到容器的80端口,仅用于从主机或外部直接访问容器,不影响Docker网络内部的通信。- Traefik和你的服务在同一个Docker网络中,它需要访问容器内部实际监听的端口(也就是Apache的80端口),而不是主机上的映射端口9999。之前配置
loadbalancer.server.port=9999,相当于让Traefik去访问容器的9999端口,但容器内部根本没有服务监听这个端口,所以出现"Bad Gateway"。
关于你尝试的其他操作
- 添加
traefik.port=9999无效:这个标签是Traefik v1的旧语法,且同样错误指向了容器不存在的端口,所以无法解决问题。 - 移除负载均衡器标签后出现404:Traefik会尝试自动探测容器的端口,可能探测到了其他未提供服务的端口,导致路由无法匹配,返回404。
验证步骤
- 应用修改后的配置:
docker-compose up -d - 访问
https://resumecvbackend.example.com,应该能正常服务 - 本地测试依然可以用
curl http://127.0.0.1:9999
内容的提问来源于stack exchange,提问作者sineverba
相关产品推荐
相关产品推荐

