Traefik入门指南与Docker配合使用简析

5,940 阅读18分钟

一、简介

Traefik 是一个优秀的开源边缘路由器,也就是反向代理工具。

相比于Nginx,它具有如下优点:

  1. 自动服务发现:传统的边缘路由器(或反向代理)需要一个配置文件,其中包含到您的服务的所有可能的路由,而 Traefik 从服务本身获取它们。

  2. 原生兼容所有主要集群技术,例如 Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon,并且可以同时处理多个。

  3. 无需维护和同步单独的配置文件,自动实时更新,无需重新启动,不会中断连接

  4. 集成了漂亮的 dashboard 界面

二、使用 Docker 的简单用例

新建docker-compose.yml文件,创建了一个reverse-proxy服务,使用官方 Traefik 镜像:

version: '3'

services:
  reverse-proxy:
    # The official v2 Traefik docker image
    image: traefik:v2.4
    # 启用dashboard并使用docker作为provider
    command: --api.insecure=true --providers.docker
    ports:
      # The HTTP port
      - "80:80"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock

启动:

docker-compose up -d reverse-proxy

打开浏览器并转到 localhost:8080/api/rawdata 以查看 Traefik 的 API 原始数据。

创建一个新服务,编辑您的docker-compose.yml文件并在文件末尾添加以下内容

# ...
  whoami:
    # 展示ip地址的容器
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"

启动服务:

docker-compose up -d whoami

返回您的浏览器(localhost:8080/api/rawdata ),可以看到 Traefik 已自动检测到新容器并更新了自己的配置。

当 Traefik 检测到新服务时,它会创建相应的路由,以便您可以调用它们:

curl -H Host:whoami.docker.localhost http://127.0.0.1

显示以下输出:

Hostname: a656c8ddca6c
IP: 172.27.0.3
#...

扩容测试负载均衡:

docker-compose up -d --scale whoami=2

运行以下命令,查看 Traefik 在服务的两个实例之间进行负载平衡:

curl -H Host:whoami.docker.localhost http://127.0.0.1

输出将显示以下选项之一:

Hostname: a656c8ddca6c
IP: 172.27.0.3
#...
# 或者
Hostname: s458f154e1f1
IP: 172.27.0.4
# ...

三、配置

Traefik 中的配置分为2部分:

  • 全动态路由配置(动态配置),从Provider获取_,_定义如何由系统来处理请求。此配置可以更改并无缝热重载,不会出现任何请求中断或连接丢失。
  • 启动配置(静态配置),设置与Provider连接并定义Traefik 将侦听的入口点。

在 Traefik 中定义静态配置选项有三种不同的、互斥的(即您只能同时使用一种)的方法:

  1. 在配置文件中

  2. 在命令行参数中

  3. 作为环境变量

配置文件

启动时,Traefik 在以下位置搜索名为traefik.yml(或traefik.yamltraefik.toml)的文件:

  1. /etc/traefik/
  2. $XDG_CONFIG_HOME/
  3. $HOME/.config/
  4. .(工作目录)。

您可以使用configFile参数覆盖它。

traefik --configFile=foo/bar/myconfigfile.yml

参数

可以使用以下命令,获取所有可用参数的列表:

traefik --help

# or

docker run traefik[:version] --help
# ex: docker run traefik:2.1 --help

一些常见的参数有:

--accesslog:
访问日志设置。(默认值:false)

--api:
启用 api/仪表板。(默认值:false)

--certificatesresolvers.<name>:
证书解析器配置。(默认值:false)

--entrypoints.<name>:
入口点定义。(默认值:false)

--log:
Traefik 日志设置。(默认值:false)

--pilot.dashboard:
在仪表板中启用 Traefik Pilot。(默认值:true)

--ping:
启用ping。(默认值:false)

--providers.docker:
使用默认设置启用 Docker 后端。(默认值:false)

环境变量

常见的环境变量有(和参数一样,只不过换成大写形式,加上TRAEFIK_前缀):

TRAEFIK_ACCESSLOG:
访问日志设置。(默认值:false)

TRAEFIK_API:
启用 api/仪表板。(默认值:false)

TRAEFIK_CERTIFICATESRESOLVERS_<NAME>:
证书解析器配置。(默认值:false)

TRAEFIK_ENTRYPOINTS_<NAME>:
入口点定义。(默认值:false)

TRAEFIK_LOG:
Traefik 日志设置。(默认值:false)

TRAEFIK_PILOT_DASHBOARD:
在仪表板中启用 Traefik Pilot。(默认值:true)

TRAEFIK_PING:
启用ping。(默认值:false)

TRAEFIK_PROVIDERS_DOCKER:
使用默认设置启用 Docker 后端。(默认值:false)

四、Traefik 和 Docker

路由配置

当使用 Docker 作为provider 时,Traefik 使用容器标签来检索其路由配置。

如果容器expose了单个端口,则 Traefik 使用此端口进行私有通信,如果一个容器 expose了多个端口,或者没有暴露任何端口,那么你必须使用标签手动指定 Traefik 应该使用哪个端口进行通信traefik.http.services.<service_name>.loadbalancer.server.port

当容器配置了主机网络时,主机的IP地址解析如下:

  • 尝试查找 host.docker.internal
  • 如果查找不成功,则回退到 127.0.0.1

Traefik 需要访问 docker 套接字来获取API 访问权限,可以通过 endpoint 设置:

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"

Docker Swarm 模式

要启用 Docker Swarm(而不是独立 Docker)作为配置提供程序,请将swarmMode指令设置为true

在 Swarm 模式下,Traefik 使用服务上的标签,而不是单个容器上的标签。

因此,如果您在 Swarm 模式下使用撰写文件,则应在deploy服务的部分中定义标签 。

Docker Swarm 不向 Traefik提供任何端口检测信息。

因此,您必须使用标签指定要用于通信的端口traefik.http.services.<service_name>.loadbalancer.server.port

由于 Swarm API 仅在管理器节点上公开,因此应通过在节点“角色”上约束部署 Traefik 来安排 Traefik 的这些节点:

version: '3'

services:
  traefik:
    # ...
    deploy:
      placement:
        constraints:
          - node.role == manager

Provider配置

  • endpoint必需_,_默认=“unix:///var/run/docker.sock”
  • useBindPortIP可选,默认=false,Traefik 将请求路由匹配到容器的 IP/端口。设置useBindPortIP=true,Traefik 使用附加到容器绑定的 IP/端口,而不是其内部网络 IP/端口。当与traefik.http.services.<name>.loadbalancer.server.port标签结合使用时(告诉 Traefik 将请求路由匹配到特定端口),Traefik 会尝试在 port 上找到绑定traefik.http.services.<name>.loadbalancer.server.port。如果找不到这样的绑定,Traefik 会回退到容器的内部网络 IP,但仍然使用traefik.http.services.<name>.loadbalancer.server.port标签中设置的IP/端口 。
  • exposedByDefault可选_,默认=true。_默认情况下Traefik 公开容器。如果设置为falsetraefik.enable=true则从生成的路由配置中忽略没有标签的容器。
  • network可选,默认=“”定义用于连接到所有容器的默认 docker 网络。可以使用traefik.docker.network标签在每个容器的基础上覆盖此选项。
  • defaultRule_可选,默认=Host(`{{ normalize .Name }}`)。_如果标签未定义任何规则,则该选项定义要应用于容器的路由规则。
  • swarmMode_可选,默认=false。_启用 Swarm 模式(而不是独立的 Docker)。
  • swarmModeRefreshSeconds_可选,默认值=15。_定义群模式的轮询间隔(以秒为单位)。
  • httpClientTimeout_可选,默认=0。_定义 HTTP 连接的客户端超时(以秒为单位)。如果它的值为0,则不设置超时。
  • watch_可选,默认=true。_监听 Docker Swarm 事件。
  • constraints_可选,默认=“”。_该constraints选项可以设置为 Traefik 与容器标签匹配的表达式,以确定是否为该容器创建任何路由。如果没有容器标签与表达式匹配,则不会为该容器创建路由。如果表达式为空,则包括所有检测到的容器。 表达式语法基于Tag(`tag`), 和TagRegex(`tag`)函数以及通常的布尔逻辑,如下所示。
# key为 `a.label.name` 值为 `foo`的容器
constraints = "Label(`a.label.name`, `foo`)"

# 排除key为 `a.label.name` 值为 `foo`的容器
constraints = "!Label(`a.label.name`, `value`)"

# 与
constraints = "Label(`a.label.name`, `valueA`) && Label(`another.label.name`, `valueB`)"

# 或
constraints = "Label(`a.label.name`, `valueA`) || Label(`another.label.name`, `valueB`)"
  • tls
  1. tls.ca用于安全连接到 Docker 的证书颁发机构。

  2. tls.caOptional定义应使用哪个策略与 TLS 客户端身份验证到 Docker 的安全连接。

  3. tls.cert用于安全连接到 Docker 的公共证书

  4. tls.key用于安全连接到 Docker 的私有证书

  5. tls.insecureSkipVerify如果insecureSkipVerifytrue,则与 Docker 的 TLS 连接接受服务器提供的任何证书,而不管它涵盖的主机名

五、路由和负载平衡

完整的Traefik 的架构分为这几部分:

  • entryPoints 侦听传入流量(端口,...)EntryPoints 是 Traefik 的网络入口点。它们定义了将接收数据包的端口,以及是侦听 TCP 还是 UDP。
  • routers 分析请求(主机、路径、标头、SSL 等),路由器负责将传入请求连接到可以处理它们的服务
  • services 将请求转发给您的服务(负载平衡,...)
  • middlewares 可能会更新请求或根据请求做出决定(身份验证、速率限制、标头等)
  • providers 发现存在于您的基础架构上的服务(他们的 IP、健康状况……)

EntryPoints配置实例:

## 静态配置
entryPoints:
  name:
    address: ":8888" # same as ":8888/tcp"
    transport:
      lifeCycle:
        requestAcceptGraceTimeout: 42
        graceTimeOut: 42
      respondingTimeouts:
        readTimeout: 42
        writeTimeout: 42
        idleTimeout: 42
    proxyProtocol:
      insecure: true
      trustedIPs:
        - "127.0.0.1"
        - "192.168.0.1"
    forwardedHeaders:
      insecure: true
      trustedIPs:
        - "127.0.0.1"
        - "192.168.0.1"
  • address定义了端口和主机名(可选),用于侦听传入的连接和数据包。它还定义了要使用的协议(TCP 或 UDP)。如果未指定协议,则默认为 TCP。格式为:
[host]:port[/tcp|/udp]
  • forwardedHeaders您可以将 Traefik 配置为信任转发的标头信息 (X-Forwarded-*)。
  • transport
  1. respondingTimeouts对 Traefik 实例的传入请求的超时。设置它们对 UDP 入口点没有影响。
  2. lifeCycle控制 Traefik 在关闭阶段的行为
  • proxyProtocol如果为入口点启用了代理协议标头解析,则此入口点可以接受带有或不带有代理协议标头的连接。

  • HTTP 配置HTTP 路由

routers配置实例:

routers可以配置 HTTP 路由器、TCP 路由器、UDP 路由器,本文只介绍Http

## 配置Http路由
http:
  routers:
    Router-1:
      # By default, routers listen to every entry points
      rule: "Host(`example.com`)"
      service: "service-1"
  • rule规则是一组配置有值的匹配器,用于确定特定请求是否与特定标准匹配。如果规则得到验证,路由器将变为活动状态,调用中间件,然后将请求转发给服务。下表列出了所有可用的匹配器:
描述
Headers(`key`, `value`)检查key标题中是否定义了一个键,其值value
HeadersRegexp(`key`, `regexp`)检查key标题中是否定义了一个键,其值与正则表达式匹配regexp
Host(`example.com\`, ...)检查请求域(主机标头值)是否针对给定的domains.
HostHeader(`example.com\`, ...)检查请求域(主机标头值)是否针对给定的domains.
HostRegexp(`example.com\`, `{subdomain:[a-z]+}.example.com\`, ...)检查请求域是否与给定的regexp.
Method(`GET`, ...)检查请求方法是否是给定的methods( GET, POST, PUT, DELETE, PATCH, HEAD) 之一
Path(`/path`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`, ...)匹配准确的请求路径。它接受一系列文字和正则表达式路径。
PathPrefix(`/products/`, `/articles/{cat:[a-z]+}/{id:[0-9]+}`)匹配请求前缀路径。它接受一系列文字和正则表达式前缀路径。
Query(`foo=bar`, `bar=baz`)匹配查询字符串参数。它接受一系列键=值对。
  • priority,为避免路径重叠,默认情况下,使用规则长度按降序对路由进行排序。优先级直接等于规则的长度,因此最长的长度具有最高的优先级。0忽略优先级的值:priority = 0表示使用默认规则长度排序。
  • middlewares,您可以将中间件附加到每个 HTTP 路由器。只有在规则匹配且在将请求转发到服务之前,中间件才会生效。
# 动态配置
http:
  routers:
    my-router:
      rule: "Path(`/foo`)"
      # declared elsewhere
      middlewares:
      - authentication
      service: service-foo
  • service每个请求最终都必须由一个服务处理,这就是为什么每个路由器定义都应该包含一个服务目标
  • tls当指定了 TLS 部分时,它会指示 Traefik 当前路由器仅专用于 HTTPS 请求(并且路由器应忽略 HTTP(非 TLS)请求)。Traefik 将终止 SSL 连接(这意味着它将向服务发送解密数据)。

services配置实例:

services可以配置 HTTP 服务、TCP 服务、UDP 服务,本文只介绍Http

# 动态配置
http:
  services:
    my-service:
      loadBalancer:
        servers:
        - url: "http://<private-ip-server-1>:<private-port-server-1>/"
        - url: "http://<private-ip-server-2>:<private-port-server-2>/"
  • loadBalancer 负载平衡器能够在您的程序的多个实例之间对请求进行负载平衡
  • servers 声明程序的单个实例。该url选项指向特定实例
  • sticky 启用粘性会话后,会在初始请求和响应上设置 cookie,以让客户端知道哪个服务器处理第一个响应。在后续请求中,为了保持会话与同一服务器的活动,客户端应重新发送相同的 cookie。
# 动态配置
http:
  services:
    my-service:
      loadBalancer:
        sticky:
         cookie: {}
  • healthCheck 配置健康检查以从负载平衡轮换中删除不健康的服务器。Traefik 会认为您的服务器健康,只要它们在健康检查请求在2XX3XX 之间。以下是健康检查机制的可用选项:

    • path 附加到服务器 URL 以设置运行状况检查端点。
    • scheme,如果已定义,将替换scheme运行状况检查端点的服务器 URL
    • hostname,如果已定义,则将Host标头hostname应用于健康检查请求。
    • port,如果已定义,将替换port运行状况检查端点的服务器 URL 。
    • interval 定义运行状况检查调用的频率。
    • timeout 定义 Traefik 在考虑服务器失败(不健康)之前等待健康检查请求的最长时间。
    • headers 定义要发送到健康检查端点的自定义标头。
    • followRedirects 定义在运行状况检查调用期间是否应遵循重定向(默认值:true)。
  • passHostHeader 允许客户端主机头转发到服务器

  • serversTransport 配置 Traefik 和您的服务器之间的传输

    • ServerName用于 SNI 的服务器名称
    • Certificates被设置为 mTLS 的客户端证书的证书列表
    • insecureSkipVerify禁用 SSL 证书验证
    • rootCAs使用自签名 TLS 证书时将设置为根证书颁发机构的证书列表(作为文件路径或数据字节)。
    • maxIdleConnsPerHost如果非零,则maxIdleConnsPerHost控制最大空闲(保持活动)连接以保持每个主机。
    • forwardingTimeouts将请求转发到后端服务器时相关的一些超时
  • weighted,WRR 能够基于权重对多个服务之间的请求进行负载平衡。此策略仅适用于services之间的负载平衡,而不适用于服务器之间的负载平衡

## 动态配置
http:
  services:
    app:
      weighted:
        services:
        - name: appv1
          weight: 3
        - name: appv2
          weight: 1

    appv1:
      loadBalancer:
        servers:
        - url: "http://private-ip-server-1/"

    appv2:
      loadBalancer:
        servers:
        - url: "http://private-ip-server-2/"
  • mirroring 镜像能够将发送到服务的请求镜像到其他服务。请注意,默认情况下,整个请求在被镜像时都缓存在内存中。
## 动态配置
http:
  services:
    mirrored-api:
      mirroring:
        service: appv1
        # maxBodySize is the maximum size allowed for the body of the request.
        # If the body is larger, the request is not mirrored.
        # Default value is -1, which means unlimited size.
        maxBodySize: 1024
        mirrors:
        - name: appv2
          percent: 10

    appv1:
      loadBalancer:
        servers:
        - url: "http://private-ip-server-1/"

    appv2:
      loadBalancer:
        servers:
        - url: "http://private-ip-server-2/"

docker配置实例:

转发http://example.com的请求到http://<private IP of container>:12345

version: "3"
services:
  my-container:
    # ...
    labels:
      - traefik.http.routers.my-container.rule=Host(`example.com`)
      # Tell Traefik to use the port 12345 to connect to `my-container`
      - traefik.http.services.my-service.loadbalancer.server.port=12345

转发http://example-a.com 到 http://<private IP of container>:8000,http://example-b.com转发至http://<private IP of container>:9000

version: "3"
services:
  my-container:
    # ...
    labels:
      - traefik.http.routers.www-router.rule=Host(`example-a.com`)
      - traefik.http.routers.www-router.service=www-service
      - traefik.http.services.www-service.loadbalancer.server.port=8000
      - traefik.http.routers.admin-router.rule=Host(`example-b.com`)
      - traefik.http.routers.admin-router.service=admin-service
      - traefik.http.services.admin-service.loadbalancer.server.port=9000
  • traefik.http.services.<name-of-your-choice>配置服务
  • traefik.http.middlewares.<name-of-your-choice>配置中间件
  • traefik.enable您可以通过设置traefik.enable为 true 或 false来告诉 Traefik 考虑(或不考虑)容器。此选项会覆盖 的值exposedByDefault
  • traefik.docker.network覆盖用于连接到容器的默认 docker 网络。如果一个容器链接到多个网络,请确保设置正确的网络名称(您可以使用 docker inspect <container_id>进行检查),否则它将随机选择一个(取决于 docker 返回它们的方式)。
  • traefik.docker.lbswarm启用 Swarm 的内置负载均衡器(仅在 Swarm 模式下相关)。如果启用此选项,Traefik 将使用 docker swarm 提供的虚拟 IP 而不是容器 IP。这意味着 Traefik 不会执行任何类型的负载平衡,并将此任务委托给 swarm。

六、中间件

附加到路由器的中间件是一种在请求发送到您的services 之前(或在服务的响应发送到客户端之前)调整请求的方法。

可用中间件列表:

  • AddPrefix 添加前缀
# Prefixing with /foo
labels:
  - "traefik.http.middlewares.add-foo.addprefix.prefix=/foo"
  • BasicAuth 添加基本​​身份验证
# Declaring the user list
#
# Note: when used in docker-compose.yml all dollar signs in the hash need to be doubled for escaping.
# To create user:password pair, it's possible to use this command:
# echo $(htpasswd -nB user) | sed -e s/\\$/\\$\\$/g
#
# Also note that dollar signs should NOT be doubled when they not evaluated (e.g. Ansible docker_container module).
labels:
  - "traefik.http.middlewares.test-auth.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,test2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"
  • Buffering 限制了可以转发到服务的请求的大小。通过缓冲,Traefik 将整个请求读入内存(可能将大请求缓冲到磁盘中),并拒绝超过指定大小限制的请求。这可以帮助服务避免大量数据(multipart/form-data例如),并且可以最大限度地减少向服务发送数据所花费的时间。
# Sets the maximum request body to 2MB
labels:
  - "traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=2000000"
  • Chain 中间件使您能够定义其他中间件的可重用组合。它使重用相同的组更容易。下面是含有链的一个例子WhiteListBasicAuthRedirectScheme
labels:
  - "traefik.http.routers.router1.service=service1"
  - "traefik.http.routers.router1.middlewares=secured"
  - "traefik.http.routers.router1.rule=Host(`mydomain`)"
  - "traefik.http.middlewares.secured.chain.middlewares=https-only,known-ips,auth-users"
  - "traefik.http.middlewares.auth-users.basicauth.users=test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"
  - "traefik.http.middlewares.https-only.redirectscheme.scheme=https"
  - "traefik.http.middlewares.known-ips.ipwhitelist.sourceRange=192.168.1.7,127.0.0.1/32"
  - "traefik.http.services.service1.loadbalancer.server.port=80"
  • CircuitBreaker 断路器保护您的系统免于将请求堆叠到不健康的服务,从而导致级联故障。
# Latency Check
labels:
  - "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
  • Compress 中间件使用 gzip 压缩

  • ContentType指定是否让Content-Type标头(如果后端尚未定义)自动设置为从响应内容派生的值。

  • DigestAuth 中间件将您的服务的访问权限限制为已知用户

  • ErrorPage 中间件根据 HTTP 状态代码的配置范围返回一个自定义页面来代替默认页面。

  • ForwardAuth 中间件将身份验证委托给外部服务。如果服务以 2XX 代码应答,则授予访问权限,并执行原始请求。否则,返回来自认证服务器的响应。

  • Headers 中间件管理请求和响应的标头。

  • IPWhitelist 根据客户端 IP 接受/拒绝请求。

  • inflightreq 限制同时进行中的请求数

  • PassTLSClientCert 将通过的客户端 TLS 证书中的选定数据添加到标头中。

  • RateLimit控制进入服务的请求数

  • RedirectRegex 使用正则表达式匹配和替换来重定向请求。

  • RedirectScheme 将请求从一个方案/端口重定向到另一个。

  • replacepath替换请求 URL 的路径。

  • ReplaceRegex 使用正则表达式匹配和替换来替换 URL 的路径。

  • retry 如果后端服务器没有回复,重试中间件向后端服务器重新发出给定次数的请求。服务器一响应,中间件就会停止重试,无论响应状态如何。Retry 中间件有一个可选配置来启用指数退避。

  • stripprefix 在转发请求之前从路径中删除前缀

  • stripprefixregex 在转发请求之前从路径中删除前缀(使用正则表达式)

七、Dashboard

仪表板可以可视化地展示traefik的所有服务运行情况。

有两种方法可以配置和访问仪表板:

1、安全模式

首先在静态配置上使用以下选项启用仪表板:

api:
  dashboard: true

然后在 Traefik 本身上定义路由配置,api@internal在动态配置中将路由器连接到服务,以允许定义通 身份验证(basicAuth、digestAuth、 forwardAuth)或白名单等中间件实现的一项或多项安全功能。

labels:
      - "traefik.http.routers.api.service=api@internal"

然后设置规则:

labels:
      - "traefik.http.routers.api.rule=Host(`traefik.example.com`)"

此时可以通过 traefik.example.com/dashboard/ 来访问dashboard

2、不安全模式

不推荐使用此模式,因为它不允许使用安全功能。

api:
  dashboard: true
  insecure: true

您现在可以通过8080以下 URL访问Traefik 实例端口上的仪表板:(http://<Traefik IP>:8080/dashboard/尾斜杠是必需的)。

八、日志

默认情况下,日志以文本格式写入标准输出。

  • filePath您可以使用filePath选项配置文件路径
# 日志写入文件
log:
  filePath: "/path/to/traefik.log"
  • format默认情况下,日志使用文本格式 (common),但您也可以使用json格式写入
# 已json形式写入文件
log:
  filePath: "/path/to/log-file.log"
  format: json
  • level默认情况下,level设置为ERROR。替代日志记录级别为DEBUGPANICFATALERRORWARN,和INFO
log:
  level: DEBUG

九、https配置

您可以将 Traefik 配置ACME 程序(如 Let's Encrypt)来自动生成证书。

Traefik 要求您在静态配置定义“证书解析器”,它们负责从 ACME 服务器检索证书。从路由器的动态配置检索域名需要的证书。

首先配置traefik的配置文件:

entryPoints:
  web:
    address: ":80"

  websecure:
    address: ":443"

certificatesResolvers:
  myresolver:
    acme:
      email: your-email@example.com
      storage: acme.json
      httpChallenge:
        # used during the challenge
        entryPoint: web

它有如下配置选项:

  • tlsChallenge TLS-ALPN-01通过提供 TLS 证书,生成和更新 ACME 证书。

  • httpChallenge通过在HTTP-01众所周知的 URI 下供应 HTTP 资源,生成和更新 ACME 证书。

  • dnsChallenge DNS-01通过提供 DNS 记录,生成和更新 ACME 证书。

  • resolvers使用自定义 DNS 服务器来解析 FQDN 权限

  • caServer要使用的 CA 服务器。_必需,默认=acme-v02.api.letsencrypt.org/directory

  • storage设置您的 ACME 证书的保存位置,必需,默认=“acme.json”

  • preferredChain要使用的首选链,_可选,默认=“”。_如果 CA 提供多个证书链,则首选具有与此主题通用名称匹配的颁发者的链。如果不匹配,将使用默认提供的链。

  • keyType 用于生成证书私钥。允许值“EC256”、“EC384”、“RSA2048”、“RSA4096”、“RSA8192”。可选,默认=“RSA4096”

然后在docker中设置:

## 动态配置
labels:
  - traefik.http.routers.blog.rule=Host(`example.com`) && Path(`/blog`)
  - traefik.http.routers.blog.tls=true
  - traefik.http.routers.blog.tls.certresolver=myresolver

Traefik 会自动跟踪它生成的 ACME 证书的到期日期。如果距离证书到期的时间不足 30 天,Traefik 将尝试自动续订。