在官方Docker文档里你找不到任何关于组成服务的单个实例地址的说明。
当你阅读本书的时候,上面的说法可能过时了,可能已经有人更新了文档。但是,在撰写本章的时候,还没有关于这些信息的任何迹象。
实际上,没有被记录的事情并不意味着它不存在,Docker里确实有一个会返回所有IP的DNS。
为了在实际中看到它,我们创建名为util的全局服务并将其连接到代理网络:
在继续之前,请等到当前状态变为RUNNING。
接下来,找出其中一个util实例的ID并安装drill,它将向我们显示与DNS条目相关的信息:
首先得到钻取DNS代理:
输出如下:(www.xing528.com)
正如你所看到的,尽管运行了三个服务实例,但是只返回了一个IP 10.0.0.2。这是服务的IP,而不是单个实例的IP。更具体地说,它是代理服务网络端点的IP。当请求到达该端点时,Docker网络会在所有实例之间进行负载平衡。
在大多数情况下,这对我们已经足够了。我们只需要知道服务的名称,Docker会为我们完成剩下的工作。但是,在少数情况下,我们可能需要更多,可能需要知道服务的每个实例的IP地址。这也是Docker Flow Proxy面临的问题。
要查找服务的所有实例的IP,可以使用“未公开”的功能。我们需要给服务名加上tasks前缀。
我们再来试一次:
这次的输出跟上次不同:
我们得到了三个回应,每个都有不同的IP 10.0.0.4、10.0.0.3、10.0.0.5。知道所有实例的IP解决了同步数据的问题。通过task.<SERVICE_NAME>,我们得到了需要的所有信息,剩下的只是使用这些IP的编程工作。同步数据库的时候使用了类似的机制(稍后将介绍更多内容)。
现在还没结束,可以根据需求(或事件)同步数据的事实并不意味着该服务具有容错性。如果需要创建一个新实例,我们应该怎么做?如果一个实例失败并且Swarm将其重新调度到其他地方会发生什么?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。