Traefik v3.0 Docker 全面使用指南:基础篇
Traefik v3.0 Docker 全面使用指南:基础篇

背景与核心痛点:相较于传统 Nginx 需要手动编写与频繁重载反向代理配置,现代云原生反向代理 Traefik v3.0 深度集成了 Docker Provider 自动服务发现能力。只需在容器的 labels 中声明路由规则,即可实现零配置自动化反代、HTTPS 证书全自动签发与丰富的中间件(压缩、重定向、认证)链式编排。本文系统梳理从最简容器到生产级高可用 Traefik v3.0 的实操要点。
目录
- Traefik v3.0 核心演进与架构
- Traefik 最简 Docker 容器验证
- 基于 Docker Provider 的服务域名绑定
- 生产级配置增强:HTTPS 与中间件编排
- 完整生产级 docker-compose.yml 模板
- 案例实战:为 Nginx 容器添加动态反代
Traefik v3.0 核心演进与架构
Traefik 作为专为微服务设计的云原生边缘路由器,核心组件分为三层:
- Entrypoints:入口点,负责监听外部端口(如
:80、:443、:8080)。 - Routers:路由器,根据 Host 域名、Path 路径或 Headers 规则将流量分发给指定服务,并按需挂载中间件。
- Middlewares:中间件,在请求到达服务前进行链路变换(如 HTTPS 强制重定向、Gzip 压缩、BasicAuth 鉴权等)。
- Services:后端服务与负载均衡器,负责将请求转发至健康的容器实例。
Traefik 最简 Docker 容器验证
最基础的快速验证配置仅需声明 Traefik 官方镜像并启用内部 Dashboard:
version: "3"
services:
traefik:
image: traefik:v3.0.0
ports:
- "8080:8080"
command: "--api=true --api.dashboard=true --api.insecure=true"
启动后在浏览器打开 http://localhost:8080/dashboard 即可预览 Traefik 内部仪表盘。
基于 Docker Provider 的服务域名绑定
通过挂载 Docker Socket(/var/run/docker.sock),Traefik 可以实时监听容器生命周期。当新容器启动带有指定标签(labels)时,Traefik 会自动为其创建路由器而无需重启网关:
version: "3"
services:
traefik:
image: traefik:v3.0.0
ports:
- "80:80"
- "8080:8080"
command:
- "--api=true"
- "--api.dashboard=true"
- "--entrypoints.http.address=:80"
- "--providers.docker=true"
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
labels:
- "traefik.http.routers.dashboard.entrypoints=http"
- "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.dashboard.service=dashboard@internal"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
生产级配置增强:HTTPS 与中间件编排
在实际生产中,必须添加以下关键保障:
- 自动 HTTPS 强制跳转:通过
redirectscheme中间件将所有 HTTP 请求无缝重定向到 HTTPS。 - 静态文件 Gzip 压缩:开启
compress中间件降低网络带宽传输开销。 - 日志滚动限制:配置 Docker 日志驱动最大限制(如
max-size: 10m),防止长时间运行日志耗尽磁盘。
完整生产级 docker-compose.yml 模板
version: "3"
services:
traefik:
image: traefik:v3.0.0
restart: always
ports:
- "80:80"
- "443:443"
command:
- "--global.sendanonymoususage=false"
- "--global.checknewversion=false"
- "--api.dashboard=true"
- "--log.level=INFO"
- "--entrypoints.http.address=:80"
- "--entrypoints.https.address=:443"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.network=traefik"
- "--certificatesresolvers.le.acme.email=admin@yourdomain.com"
- "--certificatesresolvers.le.acme.storage=/certs/acme.json"
- "--certificatesresolvers.le.acme.httpchallenge.entrypoint=http"
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.gzip.compress=true"
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik-http.entrypoints=http"
- "traefik.http.routers.traefik-http.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik-http.middlewares=https-redirect"
- "traefik.http.routers.traefik-https.entrypoints=https"
- "traefik.http.routers.traefik-https.rule=Host(`traefik.yourdomain.com`)"
- "traefik.http.routers.traefik-https.tls=true"
- "traefik.http.routers.traefik-https.tls.certresolver=le"
- "traefik.http.routers.traefik-https.service=dashboard@internal"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./certs:/certs
logging:
driver: "json-file"
options:
max-size: "10m"
networks:
traefik:
external: true
案例实战:为 Nginx 容器添加动态反代
启动 Traefik 后,任何加入 traefik 网络的容器都可以通过 labels 自动完成域名代理与 SSL 签发:
version: "3"
services:
web:
image: nginx:alpine
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`app.yourdomain.com`)"
- "traefik.http.routers.web.entrypoints=https"
- "traefik.http.routers.web.tls=true"
- "traefik.http.routers.web.tls.certresolver=le"
- "traefik.http.services.web.loadbalancer.server.port=80"
networks:
traefik:
external: true
本文是转载文章,版权归原作者所有。建议访问原文,转载本文请联系原作者。
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果