主题模式
Are you an LLM? You can read better optimized documentation at /fe/docker/traefik-guide.md for this page in Markdown format
使用 Traefik 反向代理与自动申请 Wildcard SSL 证书部署 Docker 容器实战
在自托管服务器(Homelab)或云服务器上,我们通常会使用 Nginx Proxy Manager 或 Nginx 来为各种 Docker 容器(如 Emby 影音服务、Dify 智能体)配置反向代理和 SSL 证书。
但在微服务架构中,Nginx 有个致命的痛点:每次新增一个容器,你都必须手动登录 Nginx 面板去添加一次反代域名,并点击申请 SSL 证书。这非常不符合容器化的“自动化声明式”美学。
Traefik 是专门为容器和微服务设计的现代边缘路由器/反向代理。它最大的杀手锏是 Docker Provider (服务自动发现):你只需要在新建容器的 labels 中声明你的域名,Traefik 就会自动发现并接入该服务,同时在后台自动向 Let's Encrypt 申请泛域名 (Wildcard) 证书。 整个过程你不需要修改任何 Traefik 配置文件。
本文将带你手把手使用 Docker Compose 部署 Traefik v3.0,并结合 Cloudflare DNS API 实现泛域名证书的自动申请与容器自动反代。
🧭 Traefik 的服务自动发现原理
传统的反向代理是“静态配置的”。而 Traefik 是“动态监听的”:
- Traefik 通过挂载宿主机的
docker.sock,实时监听 Docker 引擎的容器启动与销毁事件。 - 当你启动一个带有指定
labels的新容器时,Traefik 会自动读取这些标签,并在内存中秒级生成路由(Routing Rules)、绑定端口并调用 acme 模块申请证书。 - 容器销毁时,路由也会自动注销。
🛠️ 第一步:前置准备与网络规划
- 准备域名并接入 Cloudflare。
- 获取 Cloudflare API 令牌 (Token):
- 登录 Cloudflare 控制台 -> 点击右上角“我的个人资料” -> “API 令牌” -> “创建令牌”。
- 使用 “编辑区域 DNS” 模板,获取一个包含编辑你域名 DNS 记录权限的 API Token。
- 创建 Docker 外部共享网络: 为了让 Traefik 能够与其它目录下的独立容器通信,我们创建一个名为
traefik_net的全局外部网络:bashdocker network create traefik_net
⚙️ 第二步:使用 Docker Compose 部署 Traefik
在你的服务器上创建 /docker/traefik 文件夹,并创建以下文件:
1. 创建空证书存储文件
bash
touch acme.json && chmod 600 acme.json # 必须保证权限是 600,否则 Let's Encrypt 校验会报错2. 编写静态配置文件 traefik.yml
这是 Traefik 的核心全局配置文件:
yaml
api:
dashboard: true # 开启 Traefik 可视化仪表盘
insecure: true # 允许开发环境下直接通过 8080 端口访问仪表盘
entryPoints:
web:
address: :80
http:
redirections: # 强制将所有 80 端口的 HTTP 流量重定向到 443 HTTPS
entryPoint:
to: websecure
scheme: https
websecure:
address: :443
providers:
docker:
endpoint: unix:///var/run/docker.sock
exposedByDefault: false # 设为 false,只有加了 label 的容器才会被 Traefik 反代
network: traefik_net # 指定默认容器通信网络
certificatesResolvers:
cloudflare:
acme:
email: your_email@example.com # 接收证书过期提醒的邮箱
storage: acme.json
dnsChallenge: # 使用 DNS-01 验证(适合内网服务器或申请泛域名证书)
provider: cloudflare
resolvers:
- 1.1.1.1:53
- 8.8.8.8:533. 编写 docker-compose.yml
yaml
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: always
ports:
- '80:80'
- '443:443'
- '8080:8080'
environment:
- CF_DNS_API_TOKEN=你的Cloudflare_API_TOKEN # 传入环境变量用于 DNS 挑战
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # 只读挂载 Docker 守护进程
- ./acme.json:/acme.json
- ./traefik.yml:/etc/traefik/traefik.yml
networks:
- traefik_net
networks:
traefik_net:
external: true # 声明使用我们预先创建的外部网络运行命令启动 Traefik:
bash
docker compose up -d🚀 第三步:部署业务容器,体验“热插拔自动反代”
现在我们部署一个普通的业务测试容器(比如 whoami),看看我们是如何不用碰 Traefik 的情况下实现域名 SSL 自动反代的。
在服务器的任意其它目录下,编写测试容器的 docker-compose.yml:
yaml
services:
whoami:
image: traefik/whoami
container_name: test_whoami
labels:
- 'traefik.enable=true' # 告诉 Traefik 接管此容器
- 'traefik.http.routers.whoami.rule=Host(`whoami.yourdomain.com`)' # 绑定的域名
- 'traefik.http.routers.whoami.entrypoints=websecure'
- 'traefik.http.routers.whoami.tls=true' # 开启 TLS
- 'traefik.http.routers.whoami.tls.certresolver=cloudflare' # 指定使用 Cloudflare 证书解析器
# 额外声明申请泛域名(*.yourdomain.com)证书:
- 'traefik.http.routers.whoami.tls.domains[0].main=yourdomain.com'
- 'traefik.http.routers.whoami.tls.domains[0].sans=*.yourdomain.com'
- 'traefik.http.services.whoami.loadbalancer.server.port=80' # 容器内部运行的真实端口
networks:
- traefik_net
networks:
traefik_net:
external: true运行 docker compose up -d 启动该容器。
🌟 见证奇迹的时刻:
大约等待 1-2 分钟(Cloudflare 写入 DNS 挑战 TXT 记录并被 Let's Encrypt 校验通过后),在浏览器输入 https://whoami.yourdomain.com:
- 网页顺利打开!
- 地址栏多了一把安全的锁头,查看证书,已经是签发给
*.yourdomain.com的合法安全 SSL 证书! - 整个过程中,你完全没有打开过任何 Nginx 控制台,只通过一份声明式的 Compose 文件便搞定了所有运维操作。
💬 总结
在微服务时代,Traefik 代表了先进的数据路由理念。通过 Docker API 监听与 labels 规则注入,它将繁琐的手动反代和证书续签完全自动化,是 Homelab 与云端容器运维的绝对神器。
- 数据管理:容器持久化卷的定时自动备份?参考 Docker Volume 备份与云端同步。
- 多环境管理:使用面板统一接管?去看看 Portainer Edge Agent 极速接管教程。
