【问题标题】:docker-compose + traefik - direct traffic to services outside the docker-compose networkdocker-compose + traefik - 将流量定向到 docker-compose 网络之外的服务
【发布时间】:2020-11-05 22:09:51
【问题描述】:

我提前为篇幅道歉 - 但这很有趣,尤其是对于建筑师和 traefik 向导而言。

挑战:

最重要的是,我希望有一个设置,我们可以利用traefiks 的动态配置功能来:

在容器停止时自动检测,并知道回退到开发人员机器/外部主机上的外部服务。

或者 - 当一个 local-db 容器启动时,知道它比来自外部源的 db 服务更喜欢它。

全图

我需要为几个团队优化工作流程。

约束:

  • 开发人员致力于多层复杂的微服务网格
  • 网格中的服务数量约为 50,其中一些是内存密集型的
  • 本地演示和验收测试需要从最终用户的角度展示整个网格的工作原理
  • 现在要求开发人员在本地运行所有网格,但一些具有实时数据副本的共享数据库除外 - 有时也可能在本地运行。

这需要在开发人员机器上运行绝对最低要求。 当前的解决方案在 docker-compose 和 traefik@1.x 上进行中继,我被要求保留这个,但是,我相信升级到 traefik@2.x 是可以接受的。

追求的用例

我实际上在这里与您一起追求两个用例,我相信它们具有相同的解决方案 - 至少在理论上...

用例一 - 多个微服务的本地开发

Dev-Mode = running a process in debug mode, with IDE, file-watch live reloads, etc.

AS A    - developer of services in mid layers of the service mesh
I WANT  - to be able to direct traffic to services under development to
          native processes on my machine, and keep the rest in the compose 
          network
SO THAT - I can run in Dev-Mode only services under development, 
          while all the rest in the mesh run using production-level docker 
          images in docker-compose.

用例二 - 本地开发和外部数据库

AS A    - developer of data brokers in the mesh
I WANT  - to control if containers get to the shared db or to local 
          db container using traefik
SO THAT - I can keep applications in the containers completely agnostic to 
          the topography in which they run

那么缺少什么?

作为开始 - 由于 Traefik 是所有容器间通信通过的服务总线 - 我正在寻找一种方法来配置 traefik 以使用来自外部 docker 的服务 -组成网络。

第一个用例意味着使用 traefik 作为服务总线 - 知道每个服务在哪里运行的唯一实体,可以是容器,也可以是 docker-compose 网络外部的服务。

第二个用例意味着设置 traefik 以将流量引导到在 docker-compose 网络之外运行的进程,但特别是在开发人员的机器上,而开发人员的机器又使用来自 compose 网络的服务(为此, dev compose,与生产 compose 不同 - 为网格中的每个节点公开一个入口点,包括仅在生产内部使用的服务)。

一个价格两个

我知道这里有两个问题,但我想不出另一种方法来分别提出每个问题并获得与整体情况相关的答案...

我希望有一个设置,我们可以利用traefiks 的动态配置功能来:

当容器停止时自动检测,并知道回退到开发者机器或任何其他主机上的外部服务。 或者 - 当一个 db 容器启动时,知道它比外部 db 服务更喜欢它。

我们可以要求开发人员将记录添加到他们的hosts 文件中,但是基于 DNS 的解决方案会更受欢迎,尤其是如果我们可以使用 docker 内置的 DNS :)

帮助?

非常感谢任何帮助或指出正确的方向!

【问题讨论】:

  • mm - 谢谢。正确的。我也会把它带到那里!
  • 毫米!找到一块拼图:Docker v18.03 及更高版本 - docker 主机在桥接网络中可用 host.docker.local
  • woups。我的意思是host.docker.internal...:P

标签: docker docker-compose architecture microservices traefik


【解决方案1】:

我已经做到了。

查看此处单独演示的解决方案:

https://github.com/osher/lcdev-using-compose-and-traefik

TL;DR:

  1. 开发者主机在 docker-compose 网络中以host.docker.internal 存在。
  2. 文件提供者为团队维护的每个服务提供服务和路由。 文件提供程序中的路由设置为低优先级。
  3. docker 提供者为每个 docker-compose 容器提供服务和路由。 以这种方式创建的路线被设置为高优先级。

结果:

  • 当容器存在时 - 它被使用。
  • 当容器停止时 - traefik 将尝试开发者机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多