如何在微服务架构中使用 docker-compose 最好地处理共享服务以进行本地开发?

Posted

技术标签:

【中文标题】如何在微服务架构中使用 docker-compose 最好地处理共享服务以进行本地开发?【英文标题】:How to best handle shared services using docker-compose for local development in microservice architecture? 【发布时间】:2018-09-21 12:13:39 【问题描述】:

尝试建立一种有效的模式,允许我的所有服务之间进行通信,并允许同时在多个服务上进行本地开发。我目前正在使用 docker compose 为我的应用程序设置本地开发。我的docker-compose.yml 的基本思想是这样的。

version: '3'
services:
  web: 
    <web_config>
  worker:
    <worker_config>
  service-a:

我在质疑如何处理service-a

service-a 是我正在运行的任何本地应用程序所必需的。因此,如果我同时运行这个应用程序和另一个应用程序,它们都需要与service-a 通信。

service-a 应该在自己的撰写实例中运行吗?如果是这样,networks 是我所有应用程序与service-a 通信的最佳方式吗?据我了解,这曾经是 links 的工作,但现在首选 networks。我已经尝试使用network_mode 主机运行,但遇到了问题,因为我正在使用 Docker for Mac。

我已经看到了很多意见和解决方案,但老实说,我不确定哪种方法最好。我见过的一些解决方案包括:

为我的所有服务创建一个共享的network 并在它们自己的 docker composes 中单独运行它们 使用network_mode: 'host' 并在我的主机上运行所有内容(遗憾的是我无法正常工作) 运行我所有其他服务所依赖的所有共享服务的单独组合

如果您遇到此问题并有任何建议可以分享,请告诉我,谢谢!

【问题讨论】:

你是如何在你的 docker-compose.yml 中配置 service-a 的?你能提供这些细节吗? 我没有提供该配置,因为此时我没有尝试设置任何具体内容。在how 上寻找想法以最好地解决这个问题。我只是包含了 docker-compose 的 sn-p 来说明依赖关系。 好的,那么当您说I originally tried to just have service-a running from this app's docker-compose, but I ran another application simultaneously and couldn't communicate with service-a from that application. 时,您是在尝试在另一个 docker-compose 中运行另一个应用程序? 刚刚更新了我的帖子并将其删除。感谢您指出了这一点。未能清楚地表达我的观点,即我开始尝试将其作为一种方法,但感觉不对。由于默认情况下,每个 compose 都会创建一个单独的网络(据我了解,或者从技术上讲,它是一个 bridge 网络),这让我认为使用共享的 network 可能是正确的方法。 【参考方案1】:

每个 docker-compose 都为其管理的服务建立自己的网络。正如您所建议的,使用共享桥接网络将是确保单独 docker-compose.yml 中每个不同的服务堆栈能够相互连接的最简单方法。

You can tell docker-compose to look for and use a pre-existing network。您可以使用 docker network create 创建此网络,或者在您的服务中将其指定为 docker-compose.yml 作为具有静态名称的自定义网络:

service-a docker-compose.yml

version: '3'
services:
  service-a:
    ...

networks:
  mynetwork:
    driver: bridge

然后在您的其他 docker-compose.yml 文件中使用该网络。您需要在 docker-compose.yml 的 top level 指定网络,然后您可以告诉每个服务使用它:

其他一些 docker-compose.yml

version: '3'
services:
  web:
    ...
  networks:
    - mynetwork

networks:
  mynetwork:
    external:
      name: mynetwork

我只建议第二个选项,因为你说任何其他应用程序都需要 service-a 运行。

【讨论】:

我看到这个解决方案的问题是添加到mynetwork 的所有服务都能够相互通信。我不喜欢这个想法,因为它淡化了分离应用程序的想法,并且可能会出现hostname conflict。 见this bit about custom networks。如果分离对您的堆栈至关重要,您可以为连接到服务的每个服务创建一个服务网络。

以上是关于如何在微服务架构中使用 docker-compose 最好地处理共享服务以进行本地开发?的主要内容,如果未能解决你的问题,请参考以下文章

如何在微服务架构中进行身份验证和授权

如何在微服务架构中使用 docker-compose 最好地处理共享服务以进行本地开发?

如何在微服务架构中使用 3rd 方 IDP 实现 OpenID Connect 身份验证

在微服务架构中如何以及在何处解析外键

不要在微服务架构中使用单一数据库

如何在微服务和 API 网关架构中对不同的配置文件进行身份验证和授权