跳转至

Traefik 和 Docker

标签和容器的故事

Docker

将标签添加到容器上,让 Traefik 完成剩余工作!

配置示例

配置 Docker 和 部署/暴露服务

开启 docker provider

[providers.docker]
providers:
  docker: {}
--providers.docker=true

添加 label 标签到容器上(在你的 docker compose 文件里面)

version: "3"
services:
  my-container:
    # ...
    labels:
      - traefik.http.routers.my-container.rule=Host(`mydomain.com`)

这里我们移除了 Swarm 的相关操作

路由配置

Label 标签

  • 标签不区分大小写
  • 完整的 label 标签列表可以在 文档 中查看

常规

Traefik 为每个容器创建一个对应的 服务路由

服务会自动获取一个容器的实例,路由会自动获取由 defaultRule 定义的规则(如果在标签中未定义规则的话)。

路由器

要更新自动添加到容器的路由配置,需要添加以 traefik.http.routers.<name-of-your-choice> 开头的标签,然后添加要更改的选项。

例如,为了更改规则,你可以添加这样的一个标签 traefik.http.routers.my-container.rule=Host(`mydomain.com`)

traefik.http.routers.<router_name>.rule

可以查看 规则文档 了解更多信息。

- "traefik.http.routers.myrouter.rule=Host(`mydomain.com`)"
traefik.http.routers.<router_name>.entrypoints

可以查看 入口点文档 了解更多信息。

- "traefik.http.routers.myrouter.entrypoints=web,websecure"
traefik.http.routers.<router_name>.middlewares

可以查看 中间件中间件介绍 了解更多信息。

- "traefik.http.routers.myrouter.middlewares=auth,prefix,cb"
traefik.http.routers.<router_name>.service
- "traefik.http.routers.myrouter.service=myservice"
traefik.http.routers.<router_name>.tls

可以查看 tls 文档 了解更多信息。

- "traefik.http.routers.myrouter>.tls=true"
traefik.http.routers.<router_name>.tls.certresolver

可以查看 certResolver 文档 了解更多信息。

- "traefik.http.routers.myrouter.tls.certresolver=myresolver"
traefik.http.routers.<router_name>.tls.domains[n].main

可以查看 domains 文档 了解更多信息。

- "traefik.http.routers.myrouter.tls.domains[0].main=foobar.com"
traefik.http.routers.<router_name>.tls.domains[n].sans
- "traefik.http.routers.myrouter.tls.domains[0].sans=test.foobar.com,dev.foobar.com"
traefik.http.routers.<router_name>.tls.options

可以查看 options 文档 了解更多信息。

- "traefik.http.routers.myrouter.tls.options=foobar"
traefik.http.routers.<router_name>.priority
- "traefik.http.routers.myrouter.priority=42"

服务

要更新自动添加到容器的服务配置,需要添加以 traefik.http.services.<name-of-your-choice> 开头的标签,然后添加你要更改的选项。

例如,要更改 passHostHeader 行为,你可以添加标签 traefik.http.services.<name-of-your-choice>.loadbalancer.passhostheader=false

traefik.http.services.<service_name>.loadbalancer.server.port

注册一个端口,当容器暴露多个端口时非常有用。

- "traefik.http.services.myservice.loadbalancer.server.port=8080"
traefik.http.services.<service_name>.loadbalancer.server.scheme

覆盖默认的 scheme。

- "traefik.http.services.myservice.loadbalancer.server.scheme=http"
traefik.http.services.<service_name>.loadbalancer.passhostheader
- "traefik.http.services.myservice.loadbalancer.passhostheader=true"
traefik.http.services.<service_name>.loadbalancer.healthcheck.headers.<header_name>

可以查看 健康检查 了解更多信息。

- "traefik.http.services.myservice.loadbalancer.healthcheck.headers.X-Foo=foobar"
traefik.http.services.<service_name>.loadbalancer.healthcheck.hostname
- "traefik.http.services.myservice.loadbalancer.healthcheck.hostname=foobar.com"
traefik.http.services.<service_name>.loadbalancer.healthcheck.interval
- "traefik.http.services.myservice.loadbalancer.healthcheck.interval=10"
traefik.http.services.<service_name>.loadbalancer.healthcheck.path
- "traefik.http.services.myservice.loadbalancer.healthcheck.path=/foo"
traefik.http.services.<service_name>.loadbalancer.healthcheck.port
- "traefik.http.services.myservice.loadbalancer.healthcheck.port=42"
traefik.http.services.<service_name>.loadbalancer.healthcheck.scheme
- "traefik.http.services.myservice.loadbalancer.healthcheck.scheme=http"
traefik.http.services.<service_name>.loadbalancer.healthcheck.timeout
- "traefik.http.services.myservice.loadbalancer.healthcheck.timeout=10"
traefik.http.services.<service_name>.loadbalancer.sticky

可以查看 session 亲和性 了解更多信息。

- "traefik.http.services.myservice.loadbalancer.sticky=true"
traefik.http.services.<service_name>.loadbalancer.sticky.cookie.httponly
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.httponly=true"
traefik.http.services.<service_name>.loadbalancer.sticky.cookie.name
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.name=foobar"
traefik.http.services.<service_name>.loadbalancer.sticky.cookie.secure
- "traefik.http.services.myservice.loadbalancer.sticky.cookie.secure=true"
traefik.http.services.<service_name>.loadbalancer.responseforwarding.flushinterval

FlushInterval 指定在复制响应内容时要刷新到客户端的刷新间隔时间。

- "traefik.http.services.myservice.loadbalancer.responseforwarding.flushinterval=10"

中间件

你可以使用 traefik.http.middlewares.<name-of-your-choice> 开头的标签来声明中间件,然后跟上中间件类型/选项。

例如,为了声明一个名为 my-redirectredirectscheme 中间件,你可以添加这样一个标签来表示:traefik.http.middlewares.my-redirect.redirectscheme.scheme=https

更多的可用中间件信息可以查看 中间件文档 了解更多。

声明和引用中间件
   services:
     my-container:
       # ...
       labels:
         # 声明一个中间件
         - traefik.http.middlewares.my-redirect.redirectscheme.scheme=https
         # 引用一个中间件
         - traefik.http.routers.my-container.middlewares=my-redirect

声明冲突

如果你用相同的名称声明了多个具有不同参数的中间件,则中间件将无法声明。

TCP

你可以使用标签声明 TCP 路由和服务。

声明 TCP 路由和服务
   services:
     my-container:
       # ...
       labels:
         - "traefik.tcp.routers.my-router.rule=HostSNI(`my-host.com`)"
         - "traefik.tcp.routers.my-router.tls=true"
         - "traefik.tcp.services.my-service.loadbalancer.server.port=4123"

TCP 和 HTTP

如果你声明了 TCP 路由或服务,它将阻止 Traefik 自动创建 HTTP 路由或服务,你可以为同一容器声明 TCP 路由或服务和 HTTP 路由或服务(但是必须手动进行声明)。

TCP 路由

traefik.tcp.routers.<router_name>.entrypoints

可以查看 入口点文档 了解更多信息。

- "traefik.tcp.routers.mytcprouter.entrypoints=ep1,ep2"
traefik.tcp.routers.<router_name>.rule

可以查看 规则 了解更多信息

- "traefik.tcp.routers.mytcprouter.rule=HostSNI(`myhost.com`)"
traefik.tcp.routers.<router_name>.service

可以查看 服务 了解更多信息。

- "traefik.tcp.routers.mytcprouter.service=myservice"
traefik.tcp.routers.<router_name>.tls

可以查看 TLS 了解更多信息。

- "traefik.tcp.routers.mytcprouter.tls=true"
traefik.tcp.routers.<router_name>.tls.certresolver

可以查看 certResolver 了解更多信息。

- "traefik.tcp.routers.mytcprouter.tls.certresolver=myresolver"
traefik.tcp.routers.<router_name>.tls.domains[n].main

可以查看 domains 了解更多信息。

- "traefik.tcp.routers.mytcprouter.tls.domains[0].main=foobar.com"
traefik.tcp.routers.<router_name>.tls.domains[n].sans
- "traefik.tcp.routers.mytcprouter.tls.domains[0].sans=test.foobar.com,dev.foobar.com"
traefik.tcp.routers.<router_name>.tls.options

可以查看 options 了解更多信息。

- "traefik.tcp.routers.mytcprouter.tls.options=mysoptions"
traefik.tcp.routers.<router_name>.tls.passthrough

可以查看 TLS 了解更多信息。

- "traefik.tcp.routers.mytcprouter.tls.passthrough=true"

TCP 服务

traefik.tcp.services.<service_name>.loadbalancer.server.port

注册应用的一个端口。

- "traefik.tcp.services.mytcpservice.loadbalancer.server.port=423"
traefik.tcp.services.<service_name>.loadbalancer.terminationdelay

可以查看 延迟退出 了解更多信息。

- "traefik.tcp.services.mytcpservice.loadbalancer.terminationdelay=100"

Provider 选项

traefik.enable

- "traefik.enable=true"

可以通过将 traefik.enable 设置为 true 或 false 来告诉 Traefik 是否考虑容器,改选项会覆盖 exposedByDefault 的值。

traefik.docker.network

- "traefik.docker.network=mynetwork"

覆盖默认的 Docker 网络用于和容器的连接。

如果一个容器连接到多个网络,请确保设置正确的网络名称(可以通过 docker inspect <container_id> 查看),否则它会随机选择一个(这取决于 Docker 如何返回它们)。