Traefik反向代理统一容器多站点入口教程
Traefik 如何统一管理多个容器站点?
Traefik 是一款支持自动服务发现的反向代理工具,专门为容器环境设计。
你只需要将多个 Web 服务放在同一个 Docker 网络中,并在容器 Compose 文件中添加少量标签,Traefik 就会自动监听新服务,并为每个站点分配独立的域名或路径规则,所有流量统一通过 80/443 端口进入,避免每个容器单独暴露端口带来的混乱和管理成本。
准备工作:环境与域名
在开始配置前,需要确保以下条件已具备:
- 一台安装了 Docker 和 Docker Compose 的云服务器(比如泽御云的云服务器,资质齐全、网络稳定,适合运行生产级的反向代理服务)。
- 一个已经解析到服务器 IP 的域名,用于承载主要站点(例如 example.com),也可以准备多个子域名(blog.example.com、shop.example.com)。
- 服务器防火墙放行 80、443 和 8080 端口(8080 用于 Traefik 仪表盘,可后续关闭)。
如果你使用的是云服务商,记得在安全组规则中放行这些端口。
配置 Traefik 入口与自动发现
核心思路是用 docker-compose.yml 定义 Traefik 容器和其他业务容器,
所有容器加入同一个 traefik 网络,
Traefik 通过 Docker 提供的 API 自动发现带有指定标签的容器并生成路由规则。
第一步:创建项目目录与 Compose 文件
mkdir -p ~/traefik && cd ~/traefik
nano docker-compose.yml
第二步:编写 Traefik 主容器的 Compose 配置
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
command:
- '--api.insecure=true' # 开启仪表盘(生产环境请关闭或加认证)
- '--providers.docker=true' # 启用 Docker 服务发现
- '--providers.docker.exposedbydefault=false' # 只暴露有标签的容器
- '--entrypoints.web.address=:80' # HTTP 入口
- '--entrypoints.websecure.address=:443' # HTTPS 入口(配合证书)
- '--certificatesresolvers.myresolver.acme.tlschallenge=true'
- '--certificatesresolvers.myresolver.acme.email=admin@example.com'
- '--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json'
ports:
- '80:80'
- '443:443'
- '8080:8080' # 仪表盘端口
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- traefik
networks:
traefik:
name: traefik
注意:/var/run/docker.sock挂载给 Traefik 是为了让它能监听 Docker 事件。如果担心安全,可改用docker插件或静态配置方式,此处面向新手先演示最直观的方式。
第三步:启动一个业务容器(示例:nginx 静态站点)
在同一个 Compose 文件底部追加:
whoami:
image: traefik/whoami
container_name: whoami
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.whoami.rule=Host(`whoami.example.com`)'
- 'traefik.http.services.whoami.loadbalancer.server.port=80'
networks:
- traefik
这里 whoami 是一个测试用镜像,返回请求信息。
标签中的规则告诉 Traefik:当请求域名是 whoami.example.com 时,将流量转发到此容器的 80 端口。
第四步:启动所有服务
docker-compose up -d
等待片刻,Traefik 会自动解析标签并生成路由。
将域名 whoami.example.com 解析到服务器 IP,浏览器访问应该看到 whoami 的响应信息。
如果需要添加更多站点,只需复制类似的业务容器定义,修改容器名、域名标签和服务器的端口。
所有容器共享 Traefik 的 80/443 入口。
常见问题与避坑
问题1:服务启动后无法访问,提示 404 或 Bad Gateway
- 确认域名解析正确,并指向服务器 IP。
- 检查业务容器是否真的运行(
docker ps)。 - 检查标签中的域名是否包含多余的空格。
- 查看 Traefik 日志:
docker logs traefik,通常能直接看到路由规则和错误原因。
问题2:HTTPS 证书申请失败
Traefik 默认使用 ACME 自动申请 Let's Encrypt 证书。
常见失败原因:
- 域名未正确解析到本机。
- 防火墙阻止了 80 端口(ACME 验证需要)。
- 邮箱格式错误或存储目录权限不足。
建议先暂停 HTTPS 配置,用 HTTP 确认路由正常工作后再开启证书。
问题3:Traefik Dashboard 无法访问
如果无法通过 http://服务器IP:8080 访问仪表盘,检查安全组是否放行了 8080,或者 Compose 中 api.insecure 是否设置为 true。
问题4:同一台服务器上同时运行 Nginx 或 Apache 如何处理?
Traefik 必须占用 80/443 端口,因此需要先停止其他 web 服务(如 Nginx),或修改它们使用其他端口(如 8081),再让 Traefik 代理到这些端口。
验证代理效果
配置完成后可以用以下方法验证:
- 打开浏览器访问
http://whoami.example.com,应该显示容器返回的 HTTP 头、IP 等信息。 - 访问 Traefik 仪表盘
http://服务器IP:8080,在 HTTP 路由列表中可以看到whoami路由器及规则。 - 修改本地 hosts 文件(或直接用真实域名),再添加一个新站点对应的容器并重启,无需重启 Traefik,它会自动加载。
常见问题解答 (FAQ)
Q1: Traefik 和 Nginx 反向代理有什么区别?
A: Traefik 更适合容器环境,能自动发现新服务并动态更新路由,无需手动修改配置文件再 reload。Nginx 更成熟但需要手动管理配置。对于 Docker 多站点统一入口,Traefik 更加推荐。
Q2: 多个站点使用同一个端口会不会冲突?
A: 不会。Traefik 根据请求的域名(Host)或路径(Path)进行路由区分,所以多个站点可以共享 80/443 端口,这也是反向代理的核心价值。
Q3: 必须用 Docker Compose 吗?单容器如何配置?
A: 也可用 docker run 命令,但需要指定网络和标签。Docker Compose 更适合管理多服务,推荐新手使用。
Q4: Traefik 支持 WebSocket 吗?
A: 支持,默认即可代理 WebSocket 连接,无需额外配置。
如果你在配置过程中遇到其他异常,建议优先查看 Traefik 官方文档或检查容器日志。
熟练掌握 Traefik 反向代理统一容器多站点入口后,你会发现管理多个站点变得非常高效。