Traefik 和 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 标签列表可以在 文档 中查看
常规¶
服务会自动获取一个容器的实例,路由会自动获取由 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-redirect
的 redirectscheme
中间件,你可以添加这样一个标签来表示: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.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 如何返回它们)。