是否有可能将Traefik限制到当前(docker-compose)堆栈?

目的

我有一台运行Rancher的服务器(Docker)。 在那个服务器上,我有几个不相关的堆栈。

我想让Traefik成为这个堆栈的主要交互点。 并使其负载平衡/根据path将请求代理到不同的容器。

我想让它将/api的stream量发送到后端server服务。 并发送/frontend服务的stream量。

当前状态

这里是我docker-compose.yml的瘦身版本,只显示相关的服务:

yml version: '2' services: server: image: server labels: - "traefik.frontend.rule=PathPrefix:/api" - "traefik.enable=true" - "traefik.port=80" frontend: image: frontend labels: - "traefik.frontend.rule=PathPrefix:/" - "traefik.enable=true" - "traefik.port=80" proxy: image: traefik:v1.4 command: --web --accessLog --rancher --rancher.exposedbydefault=false --rancher.metadata=true volumes: - /dev/null:/traefik.toml

然后使用监听公共端口的Rancher负载均衡器,将请求redirect到app1.example.com到我的proxy服务。 然后它将请求并根据path将stream量redirect到两个容器中的每一个。

我还将stream量redirect到traefik.app1.example.com到相同的proxy服务,到端口8080访问Web UI。

如果我只有一个堆栈,它的工作原理。

问题

如果我添加另一个堆栈(或者如果我复制了堆栈)并使用Traefik标签获得更多服务, app1proxy将从app2的服务和任何声明Traefik标签的其他堆栈读取标签。

然后,在app1proxy的Web UI中,我可以看到来自所有不同堆栈的所有后端。 但前端规则会被覆盖。

到目前为止,我已经看到了大多数关于如何使用Traefik作为独特的全局负载平衡器/代理的例子。 我只是意识到,我认为我也可以为每个堆栈创build孤立的Traefik实例,或者创build一个Traefik负载均衡器的层次结构。

在我看来,我错过了一些configuration或误解的东西。

但是,我仍然要问,每个堆栈可能有不同的孤立的Traefik实例,并且只能在自己的栈中监听和使用这些服务?

牧场主可以吗? 是否有可能与任何其他的Docker堆栈协调器(例如Swarm)?

如果可能的话,我错过了什么?

我想我find了解决办法。

看来我不能让Traefik直接在自己的堆栈中使用服务。 但是,似乎我可以使用Traefik约束和标签来实现几乎相同。

这里是我使用约束和标签更新docker-compose.yml

yml yml version: '2' services: server: image: server labels: - "traefik.frontend.rule=PathPrefix:/api" - "traefik.enable=true" - "traefik.port=80" - "traefik.tags=app1.example.com" frontend: image: frontend labels: - "traefik.frontend.rule=PathPrefix:/" - "traefik.enable=true" - "traefik.port=80" - "traefik.tags=app1.example.com" proxy: image: traefik:v1.4 command: --web --accessLog --constraints=tag==app1.example.com --rancher --rancher.exposedbydefault=false --rancher.metadata=true volumes: - /dev/null:/traefik.toml

它只会匹配具有Traefik标签app1.example.com 。 这些标签可以是任何string,但我想要过滤一个特定的域,我只是使用我想过滤的域作为标签使用。

另外,请注意标签在标签为traefik.tag的服务中设置。