我对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中?
答案 0 :(得分:2)
您使用服务名称。这将在DNS中解析为服务的VIP或5个IP地址(每个副本一个)。在幕后,VIP使用IPVS将robin循环到一个健康的副本中,而不会遭受过时的DNS问题。即使您使用默认的VIP,也可以使用service_name.tasks
获取所有副本IP地址。
在Docker的DNS实施中,您可以解析容器名称以及任何网络别名。网络别名包括带有DNSRR的服务名称(由docker-compose
使用,没有群集)。或者服务名称解析为群模式下的VIP。容器的主机名无法解析,可能是因为它可以在Docker引擎的控制范围之外(因此也无法了解)更改。