2026 Traefik 反向代理:Docker 部署实现自动服务发现与自动 HTTPS
你的 Docker 服务越来越多:Jellyfin、Navidrome、Gitea、Vaultwarden……每个服务都要配一个 Nginx 反代。你手动改 Nginx 配置、重启、设置 SSL、续期证书——周而复始。每加一个新服务,这套流程就要走一遍。
能不能让反代自己发现新服务,自动配 HTTPS,自动续期证书?
Traefik 就是来做这件事的。它是一个用 Go 语言编写的现代化反向代理和负载均衡器,GitHub 上 63.7k Star,最大的特色是 自动服务发现:你启动一个新的 Docker 容器,只要在标签(labels)里告诉 Traefik 怎么路由,它立刻就能自动配置好反向代理和 HTTPS 证书,全过程不用改一行配置文件。
相比之下,Caddy 需要手动写 Caddyfile,Nginx 需要手动写 conf 文件,Nginx Proxy Manager 虽然有个图形界面但每加一个服务也要手动点几下——Traefik 的自动化程度是最高的。
一、Traefik 与其他反代方案对比
| 对比项 | Traefik | Caddy | Nginx | Nginx Proxy Manager |
|---|---|---|---|---|
| 语言 | Go | Go | C | Go(管理面板) |
| Star | 63.7k | 73.5k | — | 25k+ |
| 自动服务发现 | ✅ 原生支持 | ❌ 手动配置 | ❌ 手动配置 | ❌ 手动添加 |
| 自动 HTTPS | ✅ Let’s Encrypt | ✅ 默认 | ❌ 需 certbot | ✅ 面板配置 |
| Docker 集成 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐ | ⭐⭐⭐ |
| K8s 集成 | ⭐⭐⭐⭐⭐ | ❌ | ⭐⭐⭐ | ❌ |
| 配置方式 | 标签 + 文件 | Caddyfile | 配置文件 | Web UI |
| 性能 | 高(Go) | 高(Go) | 极高(C) | 同 Nginx |
| 学习曲线 | 中等 | 低 | 高 | 低 |
简单结论: 如果你主要跑 Docker 容器,Traefik 的自动发现功能是杀手级优势。 Caddy 胜在配置极其简单,Nginx 性能极致但配置繁琐,NPM 适合不想碰命令行的用户。
二、Docker Compose 部署
Traefik 的部署非常巧妙——它利用 Docker 的 API 来自动发现新容器,所以你需要在 Compose 文件中挂载 Docker socket。
docker-compose.yml
version: '3.8'
services: traefik: image: traefik:v3.7 container_name: traefik restart: unless-stopped ports: - "80:80" # HTTP - "443:443" # HTTPS - "8080:8080" # Dashboard(建议内网访问) volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # 关键:让 Traefik 发现 Docker 容器 - ./traefik.yml:/traefik.yml:ro # 静态配置 - ./acme.json:/acme.json # SSL 证书存储 networks: - proxy
# 示例:被代理的服务 whoami: image: traefik/whoami container_name: whoami labels: - "traefik.enable=true" - "traefik.http.routers.whoami.rule=Host(`whoami.你的域名.com`)" - "traefik.http.routers.whoami.entrypoints=websecure" - "traefik.http.routers.whoami.tls.certresolver=letsencrypt" networks: - proxy
networks: proxy: external: true先创建外部网络
docker network create proxy创建静态配置 traefik.yml
# 全局配置global: sendAnonymousUsage: false
# API 和 Dashboardapi: dashboard: true debug: true
# 入口点(监听端口)entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure scheme: https websecure: address: ":443"
# 证书供应商certificatesResolvers: letsencrypt: acme: email: 你的邮箱@example.com storage: /acme.json httpChallenge: entryPoint: web
# Docker 服务发现providers: docker: endpoint: "unix:///var/run/docker.sock" exposedByDefault: false # 不默认暴露所有容器创建 acme.json 并设置权限
touch ./acme.jsonchmod 600 ./acme.json # 重要:证书文件需要严格权限启动
docker compose up -d启动后访问 http://你的服务器IP:8080 就能看到 Traefik Dashboard——它会实时显示所有被代理的服务和路由状态。
三、配置详解
3.1 入口点(EntryPoints)
入口点是 Traefik 监听的端口:
entryPoints: web: address: ":80" websecure: address: ":443" metrics: address: ":8082"3.2 服务发现机制
Traefik 的核心能力——通过 Docker 标签自动发现和配置服务。每个需要被代理的容器只要加上标签即可:
labels: # 启用 Traefik - "traefik.enable=true"
# 路由规则(匹配域名) - "traefik.http.routers.应用名.rule=Host(`你的域名.com`)" # 或匹配路径 - "traefik.http.routers.应用名.rule=Host(`你的域名.com`) && PathPrefix(`/api`)"
# 入口点(web = HTTP,websecure = HTTPS) - "traefik.http.routers.应用名.entrypoints=websecure"
# HTTPS 证书(绑定证书解析器) - "traefik.http.routers.应用名.tls.certresolver=letsencrypt"
# 指定服务端口(如果容器暴露了多个端口) - "traefik.http.services.应用名.loadbalancer.server.port=8096"3.3 中间件(Middlewares)
中间件是 Traefik 强大的扩展机制,可以做鉴权、限流、重定向等:
# 全局中间件定义(在 traefik.yml 中)http: middlewares: auth: basicAuth: users: - "admin:$2y$10$..." # 用 htpasswd 生成的密码
ratelimit: rateLimit: average: 100 burst: 50
headers: headers: frameDeny: true sslRedirect: true browserXssFilter: true contentTypeNosniff: true
# 服务上使用中间件(在 Docker 标签中)labels: - "traefik.http.routers.应用名.middlewares=auth@file,headers@file"3.4 实战:给 Jellyfin 加反代
services: jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: unless-stopped volumes: - ./jellyfin:/config - ./media:/media networks: - proxy labels: - "traefik.enable=true" - "traefik.http.routers.jellyfin.rule=Host(`jellyfin.你的域名.com`)" - "traefik.http.routers.jellyfin.entrypoints=websecure" - "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" - "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
networks: proxy: external: true启动后,访问 https://jellyfin.你的域名.com 就是自动 HTTPS 的 Jellyfin 了。
3.5 同时代理多个服务
services: # 所有服务都挂载到 proxy 网络 navidrome: networks: - proxy labels: - "traefik.enable=true" - "traefik.http.routers.navidrome.rule=Host(`music.你的域名.com`)" - "traefik.http.routers.navidrome.entrypoints=websecure" - "traefik.http.routers.navidrome.tls.certresolver=letsencrypt"
gitea: networks: - proxy labels: - "traefik.enable=true" - "traefik.http.routers.gitea.rule=Host(`git.你的域名.com`)" - "traefik.http.routers.gitea.entrypoints=websecure" - "traefik.http.routers.gitea.tls.certresolver=letsencrypt" - "traefik.http.services.gitea.loadbalancer.server.port=3000"
networks: proxy: external: trueTraefik 会自动为每个服务申请和续期 Let’s Encrypt 证书,域名解析指向你的服务器 IP 即可。
四、Dashboard 监控
Traefik Dashboard 启动后访问 http://你的服务器IP:8080:
- HTTP 路由:所有被代理的服务列表,实时显示状态
- 服务:后端服务的健康状态
- 中间件:已配置的中间件
- 证书:TLS 证书列表和过期时间
建议用以下方式安全地暴露 Dashboard:
labels: - "traefik.enable=true" - "traefik.http.routers.traefik-dash.rule=Host(`traefik.你的域名.com`)" - "traefik.http.routers.traefik-dash.entrypoints=websecure" - "traefik.http.routers.traefik-dash.tls.certresolver=letsencrypt" - "traefik.http.routers.traefik-dash.service=api@internal" - "traefik.http.routers.traefik-dash.middlewares=auth@file"五、Traefik vs Caddy 详细对比
既然这个系列已经写过 Caddy 了,这里重点对比两者的场景差异:
| 场景 | 选 Traefik | 选 Caddy |
|---|---|---|
| 单容器跑多个服务 | ✅ 自动发现 | ❌ 手动改 Caddyfile |
| 服务频繁增删 | ✅ 零配置 | ❌ 需重启 |
| K8s 环境 | ✅ 原生支持 | ❌ |
| 简单博客/单应用 | ⚠️ 有点重 | ✅ 一行配置 |
| 学习成本 | 中等 | 低 |
| TCP/UDP 转发 | ✅ 支持 | ❌ 仅 HTTP |
建议:
FAQ
Q: Traefik 和 Nginx 哪个性能好? A: Nginx 用 C 写的,裸性能略高(约 5-10%)。但 Traefik 用 Go 写的,在现代硬件上这种差距几乎可以忽略。Traefik 的自动配置节省的运维时间远大于这点性能差距。
Q: 证书怎么续期? A: 完全自动。Traefik 内置 ACME 客户端,在证书过期前(30 天)会自动向 Let’s Encrypt 申请续期,无需任何人工干预。
Q: 可以同时代理 Docker 服务和外部服务吗? A: 可以。Traefik 支持多种 Provider:
- Docker / Swarm / K8s
- 文件配置(手写)
- Consul / etcd / Zookeeper
- Marathon / Rancher
Q: /acme.json 为什么权限要设 600?
A: acme.json 里存储了你的 SSL 证书私钥。如果权限过于开放,Traefik 会拒绝启动——这是安全设计。始终用 chmod 600 acme.json。
Q: Traefik v2 和 v3 有什么区别? A: v3 是目前的最新稳定版(v3.7),主要改进:更灵活的中间件链、支持对接多个 CA 供应商、性能优化。建议直接使用 v3。
Q: 迁移从 Nginx/Caddy 到 Traefik 麻烦吗? A: 最省力的方式是:新服务直接用 Traefik 标签,旧服务逐个迁移。Traefik 可以和 Nginx/Caddy 共存,慢慢过渡。
Traefik 是 Docker 环境的反代终极方案,自动发现机制让运维变得极其简单。今天两篇文章分别覆盖了内网穿透和反向代理两个关键场景,加上之前系列中的 Caddy、Nginx Proxy Manager,自建服务的网络基建已经全部打通了。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!