高级教程
在 Docker 上使用 Traefik 暴露服务 — 高级
本指南基于基础指南中的概念和设置。确保你在继续之前已经完成了基础指南,并有可工作的 Traefik Docker 设置。
在高级指南中,你将学习如何增强你的 Traefik 部署,包括:
- 中间件:用于安全头和访问控制
- Let's Encrypt:用于自动化证书管理
- 粘性会话:用于有状态应用程序
- 多层路由:用于基于复杂认证的层级路由
- 服务中间件:在服务级别应用中间件
前置条件
- 已完成 基础指南
- 已安装 Docker 和 Docker Compose
- 基础指南中的工作 Traefik 设置
添加中间件
中间件允许你在请求通过 Traefik 时修改请求或响应。让我们添加两个有用的中间件:Headers(用于安全)和 IP allowlisting(用于访问控制)。
将以下标签添加到 docker-compose.yml 中的 whoami 服务:
yaml
labels:
# 安全头中间件
- "traefik.http.middlewares.secure-headers.headers.frameDeny=true"
- "traefik.http.middlewares.secure-headers.headers.sslRedirect=true"
- "traefik.http.middlewares.secure-headers.headers.browserXssFilter=true"
- "traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true"
- "traefik.http.middlewares.secure-headers.headers.stsIncludeSubdomains=true"
- "traefik.http.middlewares.secure-headers.headers.stsPreload=true"
- "traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000"
# IP 白名单中间件
- "traefik.http.middlewares.ip-allowlist.ipallowlist.sourceRange=127.0.0.1/32,192.168.0.0/16,10.0.0.0/8"将中间件附加到 whoami 路由器:
yaml
labels:
- "traefik.http.routers.whoami.middlewares=secure-headers,ip-allowlist"Let's Encrypt 自动化证书
要使用 Let's Encrypt 自动获取证书,添加 ACME 证书解析器:
更新 Traefik 服务的 command:
yaml
services:
traefik:
command:
# ... 现有 command
- "--certificatesresolvers.letsencrypt.acme.email=[email protected]"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--entrypoints.websecure.http.tls.certresolver=letsencrypt"
volumes:
# ... 现有卷
- ./letsencrypt:/letsencrypt将 whoami 路由器的 TLS 解析器设置为 letsencrypt:
yaml
labels:
- "traefik.http.routers.whoami.tls.certresolver=letsencrypt"粘性会话
对于有状态应用程序,使用粘性会话:
yaml
services:
whoami:
labels:
- "traefik.http.services.whoami.loadbalancer.sticky.cookie=true"
- "traefik.http.services.whoami.loadbalancer.sticky.cookie.name=session_id"
- "traefik.http.services.whoami.loadbalancer.sticky.cookie.httpOnly=true"
- "traefik.http.services.whoami.loadbalancer.sticky.cookie.secure=true"多层路由
在 Docker 中不直接支持多层路由(仅支持文件和 KV Provider)。要在 Docker 中实现类似功能,需要使用多个路由器和链式中间件。
服务中间件
服务中间件应用于该服务处理的所有请求:
yaml
services:
whoami:
labels:
- "traefik.http.services.whoami.loadbalancer.serverstransport=mytransport@docker"适用场景
- 生产环境配置:完整的安全、认证、限流
- HTTPS 自动管理:使用 Let's Encrypt
- 有状态应用:购物车、登录会话
- 基于角色的访问:多层路由
完整示例
yaml
services:
traefik:
image: traefik:v3.7
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=[email protected]"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.tls=true"
- "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
- "traefik.http.routers.whoami.middlewares=secure-headers,ip-allowlist"
- "traefik.http.middlewares.secure-headers.headers.frameDeny=true"
- "traefik.http.middlewares.secure-headers.headers.sslRedirect=true"
- "traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000"
- "traefik.http.middlewares.ip-allowlist.ipallowlist.sourceRange=127.0.0.1/32,192.168.0.0/16,10.0.0.0/8"
- "traefik.http.services.whoami.loadbalancer.sticky.cookie=true"
- "traefik.http.services.whoami.loadbalancer.sticky.cookie.name=session_id"在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。