You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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服务后:

  1. 访问http://你的服务器IP:70,应该自动跳转到https://你的服务器IP:7443
  2. 打开Traefik的API页面(http://你的服务器IP:7070),检查EntryPoints和路由规则是否正确加载

内容的提问来源于stack exchange,提问作者grafra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:46:08