Traefik反向代理容器多站点:从零搭建到自动HTTPS

为什么选择 Traefik 管理容器多站点

当你用 Docker 部署多个 Web 服务(比如博客、API、管理后台)时,每个容器都需要暴露端口,管理起来很乱。
Traefik 是一个云原生反向代理工具,能自动发现容器并绑定域名,还自带 Let's Encrypt 自动申请和续签 HTTPS 证书。
本文就用最简单的例子,让你快速跑通 Traefik 反向代理容器多站点。

动手前需要准备哪些环境

  • 一台安装了 Docker 和 docker-compose 的 Linux 服务器(CentOS 7+ 或 Ubuntu 18.04+ 都行)
  • 两个已解析到该服务器 IP 的域名,例如 site1.example.comsite2.example.com
  • 服务器防火墙开放 80 和 443 端口(Traefik 需要接收 HTTP/HTTPS 流量)
如果还没装 Docker,先执行 curl -fsSL https://get.docker.com | bash 一键安装。

Step by Step:让 Traefik 接管第一个站点

1. 创建 docker-compose 工作目录

mkdir ~/traefik && cd ~/traefik

2. 准备 Traefik 配置文件 traefik.yml

# traefik.yml
api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

3. 编写 docker-compose.yml 启动 Traefik 和一个演示站点

version: '3'

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - web

  whoami1:
    image: traefik/whoami
    container_name: whoami1
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami1.rule=Host(`site1.example.com`)"
      - "traefik.http.routers.whoami1.entrypoints=websecure"
      - "traefik.http.routers.whoami1.tls.certresolver=letsencrypt"
      - "traefik.http.services.whoami1.loadbalancer.server.port=80"
    networks:
      - web

networks:
  web:
    external: false
注意:将 site1.example.com 换成你自己的域名,your-email@example.com 换成真实邮箱(用于申请证书)。

4. 启动容器并验证

docker-compose up -d

等几十秒后,访问 https://site1.example.com,如果看到 whoami 返回的请求信息,说明第一个站点已成功反向代理并自动配置了 HTTPS。

再添加第二个站点,验证跨域访问

假设你还有第二个服务,比如一个 Nginx 静态站点。
docker-compose.yml 中追加一个新服务:

  nginx-site:
    image: nginx:alpine
    container_name: nginx-site
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nginx-site.rule=Host(`site2.example.com`)"
      - "traefik.http.routers.nginx-site.entrypoints=websecure"
      - "traefik.http.routers.nginx-site.tls.certresolver=letsencrypt"
      - "traefik.http.services.nginx-site.loadbalancer.server.port=80"
    networks:
      - web

接着执行 docker-compose up -d 重新加载。
Traefik 会自动发现新容器的标签,无需重启主进程。
访问 https://site2.example.com 就能看到 Nginx 默认页面。

常见报错与解决思路

问题 1:容器启动后无法访问,返回 404 或 502

原因:标签中的 loadbalancer.server.port 写错了,或者容器内部实际监听端口不是 80。
解决方法:修改 loadbalancer.server.port 为容器内部真实端口,比如有些应用是 8080。

问题 2:域名访问时提示“未连接私密”或证书错误

原因:Let's Encrypt 证书申请失败,通常是邮箱填错或域名解析未生效。
解决方法:先确认域名 A 记录指向服务器 IP,且 80 端口能外网访问(用于 HTTP-01 验证)。可以查看 Traefik 日志:docker logs traefik

问题 3:新版 Traefik 迁移后标签不生效

原因:标签格式旧版兼容问题。
确保使用 traefik.enable=true(注意是 enable 不是 enabled),且路由器名不重复。

避坑提醒

  • 不要多个服务共用同一个容器名:否则标签可能覆盖。
  • 网络必须是自定义网络:所有目标容器和 Traefik 必须在同一个 networks 下,才能被自动发现。如果用到 external 网络,别忘记先 docker network create
  • exposedByDefault: false 的作用:防止 Traefik 把没有标签的容器也暴露出去,安全且整洁。

效果验证总结

执行 docker-compose ps 确认所有容器都在运行。
分别用浏览器访问 https://site1.example.comhttps://site2.example.com,看到各自的内容就说明 Traefik 反向代理容器多站点配置成功。
HTTPS 证书会自动续签,无需手动干预。

如果你正在处理 Traefik 反向代理容器多站点的需求,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
RabbitMQ消息队列AI中转异步
下一篇
Harbor私有镜像仓库搭建教程:从零开始完整实操指南
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意