2016-04-05 34 views
1

我们一直在将我们系统的一部分迁移到更多面向微服务的架构。为了运行这个,我们选择将它们作为docker容器运行。目前我们的架构如下:Docker到VM Networking

一)多个Web服务器,托管还是单片PHP应用程序

B)3个新的虚拟机,这将运行

  • 的“提醒”微服务
  • 一个蒙戈DB实例
  • 自定义的microService注册表(基于Redis的)

所以,我的问题如下:

我们目前的基础设施都在10.0.0.0/24范围内。 Docker加速了172.x.1.x范围内的实例。我如何获得(在10.0.0.0/24上运行的)Web服务器连接到在“注册表”上登记的服务,例如172.17.1.3(例如)?

我读过很多扩展,比如swarm,compose等等。但是这些似乎并不能解决网络问题。

你可能会说“你已经公开了警报服务的相关端口,只是连接到该虚拟机的IP地址”,但问题是当服务(即Docker容器内的NodeJS应用程序)启动时它注册其暴露的端口与服务“注册表”。注册表使用请求的IP地址来建立一种路径。因此服务启动,并在“注册表”中注册为172.17.1.5:3001。如果这是唯一的方法,是否没有办法获得服务的IP地址主机

有什么建议吗?希望这是有道理的!

感谢您的帮助!

回答

0

注册表使用请求IP地址建立一种路径。因此服务启动,并在“注册表”中注册为172.17.1.5:3001。如果这是唯一的方法,是否没有办法获得服务的主机IP地址?

如果这些集装箱在同一主机上运行(运行一个码头工人守护进程),你不需要注册,因为所有的容器通过一个共同的泊坞窗网看到对方(在其版本docker-compose creates by default 2)

如果这些容器在不同的主机上运行(每个主机都运行它们自己的docker守护进程),则需要多一个键值存储以便跨VM虚拟机启用Docker容器可见性,从而允许您将容器名称解析为其正确的IP跨主机。
请参阅“How to make Docker container accessible to other network machines through IP?”和this tutorial

http://i.stack.imgur.com/ahLaf.png

,它可以代替你的Redis的注册表。

+0

谢谢你的回答!我可能错误输入了,我不是说docker实例被注册了。我的意思是当Docker内部运行的应用程序启动时,它将自己注册为“微服务注册表”。所以从其他客户端,我可以简单地调用{注册表IP}/find?key = alerting,这将返回客户端可以访问“警报”应用程序的IP和端口。如果这有道理?相应地更新我的问题。 – iLikeBreakfast

+0

@iLikeBreakfast我的回答站立。注册与否,这里的关键要素是:你的容器在一台机器上的一个docker守护进程中运行,还是在不同的主机上运行,​​每台主机都有自己的docker守护进程? – VonC

+0

我想让他们在不同的守护进程上运行。我认为如果我们现在就完成这个工作,它会更容易扩展。所以3个容器运行在3个不同的虚拟机上。无论如何,外部应用程序如何连接到内部容器网络?这甚至可能吗?例如,让'10.0.0.2'连接到容器'172.17.1.23'? – iLikeBreakfast