如何在微服务架构中使用 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 最好地处理共享服务以进行本地开发?