2026 Traefik 反向代理:Docker 部署实现自动服务发现与自动 HTTPS

1758 字
9 分钟
2026 Traefik 反向代理:Docker 部署实现自动服务发现与自动 HTTPS

你的 Docker 服务越来越多:JellyfinNavidromeGiteaVaultwarden……每个服务都要配一个 Nginx 反代。你手动改 Nginx 配置、重启、设置 SSL、续期证书——周而复始。每加一个新服务,这套流程就要走一遍。

能不能让反代自己发现新服务,自动配 HTTPS,自动续期证书?

Traefik 就是来做这件事的。它是一个用 Go 语言编写的现代化反向代理和负载均衡器,GitHub 上 63.7k Star,最大的特色是 自动服务发现:你启动一个新的 Docker 容器,只要在标签(labels)里告诉 Traefik 怎么路由,它立刻就能自动配置好反向代理和 HTTPS 证书,全过程不用改一行配置文件。

相比之下,Caddy 需要手动写 Caddyfile,Nginx 需要手动写 conf 文件,Nginx Proxy Manager 虽然有个图形界面但每加一个服务也要手动点几下——Traefik 的自动化程度是最高的。


一、Traefik 与其他反代方案对比#

对比项TraefikCaddyNginxNginx Proxy Manager
语言GoGoCGo(管理面板)
Star63.7k73.5k25k+
自动服务发现✅ 原生支持❌ 手动配置❌ 手动配置❌ 手动添加
自动 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

先创建外部网络#

Terminal window
docker network create proxy

创建静态配置 traefik.yml#

# 全局配置
global:
sendAnonymousUsage: false
# API 和 Dashboard
api:
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 并设置权限#

Terminal window
touch ./acme.json
chmod 600 ./acme.json # 重要:证书文件需要严格权限

启动#

Terminal window
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: true

Traefik 会自动为每个服务申请和续期 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 了,这里重点对比两者的场景差异:

场景选 TraefikCaddy
单容器跑多个服务✅ 自动发现❌ 手动改 Caddyfile
服务频繁增删✅ 零配置❌ 需重启
K8s 环境✅ 原生支持
简单博客/单应用⚠️ 有点重✅ 一行配置
学习成本中等
TCP/UDP 转发✅ 支持❌ 仅 HTTP

建议:

  • Docker 服务超过 3 个 → 用 Traefik
  • 只有 1-2 个站点 → 用 Caddy 更简单
  • 需要 TCP 负载均衡 → 用 Traefik
  • 追求极致极简 → 用 Caddy

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,自建服务的网络基建已经全部打通了。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
2026 Traefik 反向代理:Docker 部署实现自动服务发现与自动 HTTPS
https://www.kshare.top/posts/2026-traefik-反向代理docker-部署自动服务发现自动-https/
作者
Kshare
发布于
2026-06-23
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kshare
Hello, I'm Kshare.
公告
站点已开启广告(类型:弹窗广告),给您带来的不便敬请谅解。如有更好的广告建议,欢迎发送邮件至 t9uzrz6u@anonaddy.me,感谢您的支持!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
187
分类
9
标签
190
总字数
490,175
运行时长
0
最后活动
0 天前

文章目录