Skip to content

基础教程

在 Docker 上使用 Traefik 暴露服务 — 基础

本指南将帮助你开始使用 Traefik 代理在 Docker 上暴露服务。你将学习 HTTP 流量路由的基础知识、设置基于路径的路由,以及使用 TLS 保护你的服务。

前置条件

暴露你的第一个 HTTP 服务

让我们使用 whoami 应用程序暴露一个简单的 HTTP 服务。这将演示到后端服务的基本路由。

首先,创建一个 docker-compose.yml 文件:

yaml
services:
  traefik:
    image: "traefik:v3.4"
    container_name: "traefik"
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=proxy"
      - "--entryPoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "traefik/whoami"
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=web"

networks:
  proxy:
    name: proxy

将其保存为 docker-compose.yml 并启动服务:

bash
docker compose up -d

验证你的服务

你的服务现在可以在 http://whoami.docker.localhost/ 访问。测试它是否工作:

bash
curl -H "Host: whoami.docker.localhost" http://localhost/

你应该看到类似下面的输出:

Hostname: whoami
IP: 127.0.0.1
IP: ::1
IP: 172.18.0.3
IP: fe80::215:5dff:fe00:c9e
RemoteAddr: 172.18.0.2:55108
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.18.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 5789f594e7d5
X-Real-Ip: 172.18.0.1

这确认了 Traefik 正在成功地将请求路由到你的 whoami 应用程序。

添加路由规则

现在,我们将通过基于 URL 路径 将流量定向到不同的服务来增强我们的路由。这对于 API 版本控制、前端/后端分离或组织微服务很有用。

更新你的 docker-compose.yml 以添加另一个服务:

yaml
# ...

# 新服务
  whoami-api:
    image: "traefik/whoami"
    networks:
      - proxy
    container_name: "whoami-api"
    environment:
      - WHOAMI_NAME=API Service
    labels:
      - "traefik.enable=true"
      # 基于路径的路由
      - "traefik.http.routers.whoami-api.rule=Host(`whoami.docker.localhost`) && PathPrefix(`/api`)"
      - "traefik.http.routers.whoami-api.entrypoints=web"

应用更改:

bash
docker compose up -d

测试基于路径的路由

验证不同路径是否路由到不同服务:

bash
# 根路径应转到主 whoami 服务
curl -H "Host: whoami.docker.localhost" http://localhost/

# /api 路径应转到 whoami-api 服务
curl -H "Host: whoami.docker.localhost" http://localhost/api

对于 /api 请求,你应该在响应中的环境变量部分看到 "API Service",确认你的基于路径的路由正常工作。

启用 TLS

让我们通过添加 TLS 来保护我们的服务。我们将从本地开发的自签名证书开始。

创建自签名证书

生成自签名证书:

bash
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/local.key -out certs/local.crt \
  -subj "/CN=*.docker.localhost"

为动态配置创建一个目录并添加 TLS 配置文件:

bash
mkdir -p dynamic
cat > dynamic/tls.yml << EOF
tls:
  certificates:
    - certFile: /certs/local.crt
      keyFile: /certs/local.key
EOF

使用以下更改更新你的 docker-compose.yml 文件:

yaml
services:
  traefik:
    image: "traefik:v3.4"
    container_name: "traefik"
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    command:
      - "--api.insecure=false"
      - "--api.dashboard=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=proxy"
      - "--providers.file.directory=/etc/traefik/dynamic"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.websecure.address=:443"
      - "--entryPoints.websecure.http.tls=true"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      # 添加以下卷
      - "./certs:/certs:ro"
      - "./dynamic:/etc/traefik/dynamic:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`dashboard.docker.localhost`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.service=api@internal"
      # 添加以下标签
      - "traefik.http.routers.dashboard.tls=true"

  whoami:
    image: "traefik/whoami"
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      # 添加以下标签
      - "traefik.http.routers.whoami.tls=true"

  whoami-api:
    image: "traefik/whoami"
    container_name: "whoami-api"
    restart: unless-stopped
    networks:
      - proxy
    environment:
      - WHOAMI_NAME=API Service
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami-api.rule=Host(`whoami.docker.localhost`) && PathPrefix(`/api`)"
      - "traefik.http.routers.whoami-api.entrypoints=websecure"
      # 添加以下标签
      - "traefik.http.routers.whoami-api.tls=true"

networks:
  proxy:
    name: proxy

应用更改:

bash
docker compose up -d

你的浏览器可以通过 https://whoami.docker.localhost/ 访问该服务。你需要接受自签名证书的安全警告。

下一步

现在你已经掌握了使用 Traefik 在 Docker 上暴露服务的基础知识,你可以探索更高级的功能,如中间件、Let's Encrypt 证书、粘性会话和多层路由。

继续阅读高级指南 了解:

  • 添加用于安全性和访问控制的中间件
  • 使用 Let's Encrypt 生成证书
  • 为有状态应用程序配置粘性会话
  • 为基于身份验证的路由设置多层路由

基于 MIT 协议发布