Traefik & Docker

标签(Labels)和容器(Containers)的故事~

给你的容器(Containers)加上标签(Labels),剩下的事情就交给 Traefik

Traefik & Docker

路由配置(动态)

Traefik 动态更新自己的配置依不同的 provider 类型 而定,
Docker 作为 Traefik 的 provider 时,
那么 Traefik 将使用容器(Container)的标签(Labels)来检索(retrieve)它(Traefik)的路由配置~

本章内容同样适应(Docker Swarm Mode),
但只讲解 Docker 部分,关于 Docker Swarm Mode,请自己阅读官方文档 - Docker Swarm Mode

以标签的方式配置路由

默认情况下,Traefik 监视一个孤立 Docker Engine 上的 container level labels

例如:

1
docker run --label traefik.http.routers.my-container.rule=Host(`example.com`) ...

当然使用 Docker Compose 时,标签(labels)是使用 “services” objectslabels 来声明的。

例如:

1
2
3
4
5
6
7
version: "3"

services:
my-container:
# ...
labels:
- traefik.http.routers.my-container.rule=Host(`example.com`)

和 K8s 一样,推荐使用第二种有 yaml 的,这样有记录可寻~

请注意,任何能够用标签(labels)定义 Docker 容器的工具,如 Nomad、Terraform、Ansible 等都可以与 [Traefik & Docker provider] 这种模式一起使用。

检测(Detection)端口

Traefik 通过 Docker API 来检索(retrieves)容器(containers)的私有 IP 和端口。

端口检测的工作原理如下:

  • 如果容器只公开暴露一个端口,那么 Traefik 使用这个端口进行私有通信。
  • 如果容器公开暴露多个端口,或没有端口,那么你必须手动显式指定一个!!
1
- "traefik.http.services.myservice.loadbalancer.server.port=8080"

Provider 配置(静态)

Traefik 需要访问 Docker 套接字才能获取其动态配置。

你可以使用指示符(directive) endpoint,来具体指定 Docker API 的 Endpoint

1
2
3
providers:
docker:
endpoint: "unix:///var/run/docker.sock"

使用 Docker 18.09+ 以后的版本还可以使用 SHH

1
2
3
providers:
docker:
endpoint: "ssh://traefik@192.168.2.5:2022"

应该是给 Docker 和 Traefik 不是安装在同一台机器上用的,
所以需要 SHH 的 Keys 和 说明那个用户~

还有各种各样的配置,请查询 官方文档 - Provider Configuration

其它 Provider

File 作为 Traefik 的 provider 时,Traefik 就和 nginx 很类似了~

实践

文档还是官方的全,我不想搬运~
主要是提供与官方文档不同的阅读顺序,更好地从简单到全面地入门。

接下来按下面的官方图来实践一下吧~
Traefik & Docker

规划一下:
http://xxx.com/who 路由到 containous/whoami 镜像所运行的容器
http://xxx.com/hi  路由到 crccheck/hello-world 镜像所运行的容器

whoami 这个镜像运行的提供的 Paths 有,请看 GitHub 的 Paths 部分

参考资料

官方文档 - Traefik & Docker

觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/traefik/provider-docker/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除