是否有可能将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标签获得更多服务, app1
的proxy
将从app2
的服务和任何声明Traefik标签的其他堆栈读取标签。
然后,在app1
的proxy
的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
的服务中设置。