Docker Swarm,如何仅通过其“主机名”与其他服务通信?

时间:2019-03-07 08:28:27

标签: docker docker-swarm

我对Docker Compose和容器链接有一些经验。在非群环境中,您可以使用其名称轻松地从web容器连接到db_mysql容器(例如,在PHP中,我可以将MySQL连接配置为:

$dsn = 'mysql:host=db_mysql;

我很难理解它在Swarm模式下如何与Docker配合使用,尤其是考虑到“副本”和“负载平衡”机制。

假设我有5个不同的Docker机器,每个机器都有一个不同的公共IP,并参与了Swarm。我还有一个web服务和一个db服务,它们在这5台不同的机器上复制(每台机器1个实例)。

我的问题是:如何制作5个web容器中的任何一个,与5个db_mysql容器中的任何一个进行通信,而不会强迫这些web容器了解任何Docker Machine公共IP或这些容器生活在Swarm中?

1 个答案:

答案 0 :(得分:2)

您使用服务名称。这将在DNS中解析为服务的VIP或5个IP地址(每个副本一个)。在幕后,VIP使用IPVS将robin循环到一个健康的副本中,而不会遭受过时的DNS问题。即使您使用默认的VIP,也可以使用service_name.tasks获取所有副本IP地址。

在Docker的DNS实施中,您可以解析容器名称以及任何网络别名。网络别名包括带有DNSRR的服务名称(由docker-compose使用,没有群集)。或者服务名称解析为群模式下的VIP。容器的主机名无法解析,可能是因为它可以在Docker引擎的控制范围之外(因此也无法了解)更改。