如何用Traefik实现自定义Docker端口重定向?端口映射后重定向问题求助
解决Traefik v1.5.4 HTTP请求重定向问题
我猜你大概率是笔误——应该是想实现HTTP请求自动重定向到HTTPS,而不是重定向到HTTP对吧?从你给出的docker-compose.yml来看,当前配置只做了基础的端口映射和API启用,完全没配置重定向规则和TLS相关逻辑,这就是问题的核心所在。下面针对你的CentOS+Docker Swarm+Traefik v1.5.4场景,给出具体的修复方案:
核心问题拆解
Traefik不会默认开启HTTP到HTTPS的重定向,必须通过启动命令明确配置入口点(EntryPoint)的跳转规则,同时还要搭配TLS证书的加载配置,才能让重定向逻辑生效。
分步修复方案
1. 调整Traefik启动命令,启用重定向规则
针对v1.5.4版本,需要通过entryPoints参数定义HTTP和HTTPS的入口行为,把HTTP入口设置为自动跳转至HTTPS:
command: > --api --logLevel=DEBUG --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS' --docker --docker.swarmmode --docker.watch
这段配置的作用:
- 定义
http入口(对应容器内80端口,你的宿主机映射是70),强制将所有请求重定向到https入口 - 定义
https入口(容器内443端口,宿主机映射7443),启用TLS加密 - 开启Docker Swarm模式支持,让Traefik自动发现Swarm中的服务
2. 挂载SSL证书(必须步骤)
不管是用自签证书还是Let's Encrypt证书,都需要把证书文件挂载到Traefik容器里,并在启动命令中指定证书路径。假设你的证书放在宿主机的/opt/traefik/certs目录下,修改volumes和command如下:
volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/traefik/certs:/certs # 替换成你实际的证书存储路径
更新后的完整启动命令:
command: > --api --logLevel=DEBUG --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS.Certificates:[{"CertFile":"/certs/fullchain.pem","KeyFile":"/certs/privkey.pem"}]' --docker --docker.swarmmode --docker.domain=your-domain.com # 替换成你的实际域名 --docker.watch
3. 完整的docker-compose.yml示例
# use docker stack deploy to start a service running traefik version: '3.6' services: proxy: image: traefik:v1.5.4 # 固定版本,避免自动更新导致配置兼容问题 command: > --api --logLevel=DEBUG --entryPoints='Name:http Address::80 Redirect.EntryPoint:https' --entryPoints='Name:https Address::443 TLS.Certificates:[{"CertFile":"/certs/fullchain.pem","KeyFile":"/certs/privkey.pem"}]' --docker --docker.swarmmode --docker.domain=your-domain.com --docker.watch networks: - proxy ports: - "70:80" - "7443:443" - "7070:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - /opt/traefik/certs:/certs deploy: placement: constraints: - node.role == manager # 建议部署在Swarm管理节点上 networks: proxy: external: true # 使用外部网络,方便其他Swarm服务接入Traefik代理
4. 给后端服务添加Traefik路由标签
你的后端服务需要添加Traefik识别标签,才能被代理并应用重定向规则,示例如下:
services: your-backend-service: image: your-service-image networks: - proxy deploy: labels: - "traefik.enable=true" - "traefik.http.routers.your-service.rule=Host(`your-domain.com`)" - "traefik.http.services.your-service.loadbalancer.server.port=80" - "traefik.http.entryPoints=https"
验证修复效果
重启Traefik服务后:
- 访问
http://你的服务器IP:70,应该自动跳转到https://你的服务器IP:7443 - 打开Traefik的API页面(
http://你的服务器IP:7070),检查EntryPoints和路由规则是否正确加载
内容的提问来源于stack exchange,提问作者grafra
相关产品推荐
相关产品推荐

