跳到正文
Træfɪk

在 Docker Swarm 上使用 Traefik 暴露服务:基础篇

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

前提条件

暴露你的第一个 HTTP 服务

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

首先,如果尚未更新,请更新现有的 docker-compose.yml 文件:

services:
  whoami:
    image: traefik/whoami
    networks:
      - traefik_proxy
    deploy:
      replicas: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.whoami.rule=Host(`whoami.swarm.localhost`)"
        - "traefik.http.routers.whoami.entrypoints=web,websecure"

将其保存为 docker-compose.yml,然后部署堆栈:

docker stack deploy -c docker-compose.yml traefik

验证服务

现在可以通过 http://whoami.swarm.localhost/ 访问服务。测试服务是否正常工作:

curl -H "Host: whoami.swarm.localhost" http://localhost/

你应该看到类似以下内容的输出:

Hostname: whoami.1.7c8f7tr56q3p949rscxrkp80e
IP: 127.0.0.1
IP: ::1
IP: 10.0.1.8
IP: fe80::215:5dff:fe00:c9e
RemoteAddr: 10.0.1.2:45098
GET / HTTP/1.1
Host: whoami.swarm.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.0.1.1
X-Forwarded-Host: whoami.swarm.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 5789f594e7d5
X-Real-Ip: 10.0.1.1

这说明 Traefik 已成功将请求路由到 whoami 应用。

添加路由规则

接下来,我们将根据 URL 路径 将流量分发到不同服务,增强路由配置。这适用于 API 版本管理、前后端分离或微服务组织。

更新 docker-compose.yml,添加另一个服务:

# ...

# New service
  whoami-api:
    image: traefik/whoami
    networks:
      - traefik_proxy
    environment:
      - WHOAMI_NAME=API Service
    deploy:
      replicas: 2
      labels:
        - "traefik.enable=true"
        # Path-based routing
        - "traefik.http.routers.whoami-api.rule=Host(`whoami.swarm.localhost`) && PathPrefix(`/api`)"
        - "traefik.http.routers.whoami-api.entrypoints=web,websecure"
        - "traefik.http.routers.whoami-api.service=whoami-api-svc"
        - "traefik.http.services.whoami-api-svc.loadbalancer.server.port=80"

# ...

应用更改:

docker stack deploy -c docker-compose.yml traefik

测试基于路径的路由

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

# Root path should go to the main whoami service
curl -H "Host: whoami.swarm.localhost" http://localhost/

# /api path should go to the whoami-api service
curl -H "Host: whoami.swarm.localhost" http://localhost/api

对于 /api 请求,你应该在响应的环境变量部分看到“API Service”,这说明基于路径的路由工作正常。

启用 TLS

下面添加 TLS,通过 HTTPS 保护服务。我们先使用适合本地开发的自签名证书。

创建自签名证书

生成自签名证书和动态配置文件,告知 Traefik 证书所在位置:

mkdir -p certs

# key + cert (valid for one year)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/local.key -out certs/local.crt \
  -subj "/CN=*.swarm.localhost"

# dynamic config that tells Traefik where the cert lives
cat > certs/tls.yml <<'EOF'
tls:
  certificates:
    - certFile: /certificates/local.crt
      keyFile:  /certificates/local.key
EOF

为证书文件创建 Docker config:

docker config create swarm-cert.crt certs/local.crt
docker config create swarm-cert.key certs/local.key
docker config create swarm-tls.yml certs/tls.yml

按照以下内容更新 docker-compose.yml 文件:

# Add to the Traefik command section:
command:
  # ... existing commands ...
  - "--entryPoints.websecure.address=:443"
  - "--entryPoints.websecure.http.tls=true"
  - "--providers.file.directory=/etc/traefik/dynamic"
# Add to the root of your docker-compose.yml file:
configs:
  swarm-cert.crt:
    file: ./certs/local.crt
  swarm-cert.key:
    file: ./certs/local.key
  swarm-tls.yml:
    file: ./certs/tls.yml

部署堆栈:

docker stack deploy -c docker-compose.yml traefik

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

后续步骤

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

继续阅读高级指南,了解:

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

版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证