traefik 通过 docker provider 自动发现容器并基于 labels 实现零配置反向代理,挂载 docker.sock、启用 --providers.docker=true、设 exposedbydefault=false,服务用 labels 定义路由、端口、tls 和中间件,证书自动签发续期。

用 Docker Compose 配合 Traefik 实现自动反向代理,核心在于“让 Traefik 自己看懂容器、自己建路由”,不需要改配置、不重启服务,部署即生效。关键不是写一堆 YAML,而是把角色分清:Traefik 是流量管家,你的服务容器是租户,标签(labels)就是租户提交的入住申请。
Traefik 服务必须正确启动并启用 Docker Provider
Traefik 要自动发现服务,得先获得 Docker 的“实时消息”。这靠挂载 /var/run/docker.sock 和开启 Docker provider 实现。
- 在 Traefik 的
docker-compose.yml中,必须挂载宿主机的 Docker 套接字:volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" - 静态配置里要明确启用 Docker 作为服务发现源:
--providers.docker=true - 强烈建议加
--providers.docker.exposedByDefault=false,避免所有容器被意外暴露,只响应打了 Traefik 标签的服务 - 开放端口:至少
80(HTTP)、443(HTTPS),如需看 Dashboard 可加8080
微服务容器用 labels 声明“我要怎么被访问”
你的 API、前端、管理后台等服务容器,只需在自己的 docker-compose.yml 里加几行 labels,就等于告诉 Traefik:“我叫什么、监听哪个端口、该用什么域名和路径来访问我”。
-
定义路由规则:例如
traefik.http.routers.myapp.rule=Host(`app.example.com`) && PathPrefix(`/api`) -
指定后端端口:例如
traefik.http.services.myapp.loadbalancer.server.port=3000(服务容器内实际监听的端口) -
启用 HTTPS:加上
traefik.http.routers.myapp.tls=true,再配合证书解析器就能自动签发 Let's Encrypt 证书 - 多个服务互不干扰,各自 label 独立生效,Traefik 启动后自动识别、建路由、做健康检查
HTTPS 证书全自动,不用手动放文件
Traefik 可以完全托管 TLS 证书,从申请到续期全自动化,前提是配置好证书解析器。
- 在 Traefik 静态配置(如
traefik.yml)中定义certificatesResolvers.letsencrypt.acme,填上邮箱、acme.json 存储路径 -
acme.json文件权限必须设为600(chmod 600 acme.json),否则申请失败 - 在服务的 labels 中加一句:
traefik.http.routers.myapp.tls.certresolver=letsencrypt - 通配符证书(如
*.example.com)需要 DNS-01 挑战,配置稍复杂但同样全自动
进阶控制靠中间件,也用 labels 绑定
路由建好后,还能叠加限流、路径重写、Header 修改等功能,全部通过中间件(Middleware)实现,且仍走标签声明流程。
-
路径前缀剥离:比如前端请求
/api/users,后端只想收/users,加中间件traefik.http.middlewares.strip-api.stripprefix.prefixes=/api,再绑定到路由:traefik.http.routers.myapp.middlewares=strip-api -
速率限制:例如
traefik.http.middlewares.rate-limit.ratelimit.average=100(每秒平均 100 请求) - 中间件可复用,一个定义,多个路由引用,逻辑清晰,维护方便











