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

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

背景与核心痛点:相较于传统 Nginx 需要手动编写与频繁重载反向代理配置,现代云原生反向代理 Traefik v3.0 深度集成了 Docker Provider 自动服务发现能力。只需在容器的 labels 中声明路由规则,即可实现零配置自动化反代、HTTPS 证书全自动签发与丰富的中间件(压缩、重定向、认证)链式编排。本文系统梳理从最简容器到生产级高可用 Traefik v3.0 的实操要点。

目录

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 与中间件编排

在实际生产中,必须添加以下关键保障:

  1. 自动 HTTPS 强制跳转:通过 redirectscheme 中间件将所有 HTTP 请求无缝重定向到 HTTPS。
  2. 静态文件 Gzip 压缩:开启 compress 中间件降低网络带宽传输开销。
  3. 日志滚动限制:配置 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