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

时间:2018-04-11 14:38:16

标签: docker docker-compose microservices

尝试建立一个有效的模式,允许我的所有服务之间进行通信,并允许同时在多个服务上进行本地开发。我目前正在使用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'并在我的主机上运行所有内容(可悲的是我无法正常工作)
  • 运行所有其他服务依赖的所有共享服务的单独组合

如果你碰到了这个并且有任何建议可以分享,请告诉我,谢谢!

1 个答案:

答案 0 :(得分:2)

每个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的顶级中指定网络,然后您可以告诉每个服务使用它:

其他一些docker-compose.yml

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

networks:
  mynetwork:
    external:
      name: mynetwork

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