Traefik反向代理容器多站点:从零搭建到自动HTTPS
为什么选择 Traefik 管理容器多站点
当你用 Docker 部署多个 Web 服务(比如博客、API、管理后台)时,每个容器都需要暴露端口,管理起来很乱。
Traefik 是一个云原生反向代理工具,能自动发现容器并绑定域名,还自带 Let's Encrypt 自动申请和续签 HTTPS 证书。
本文就用最简单的例子,让你快速跑通 Traefik 反向代理容器多站点。
动手前需要准备哪些环境
- 一台安装了 Docker 和 docker-compose 的 Linux 服务器(CentOS 7+ 或 Ubuntu 18.04+ 都行)
- 两个已解析到该服务器 IP 的域名,例如
site1.example.com和site2.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.com 和 https://site2.example.com,看到各自的内容就说明 Traefik 反向代理容器多站点配置成功。
HTTPS 证书会自动续签,无需手动干预。
如果你正在处理 Traefik 反向代理容器多站点的需求,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。