Skip to content

高级教程

在 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 的商业支持。

基于 MIT 协议发布