我有一些使用Docker Compose和容器链接的经验。在非集群环境中,您可以很容易地使用名称从web容器连接到db_mysql容器(例如,在PHP语言中,我可以将MySQL连接配置为:
$dsn = 'mysql:host=db_mysql;
我很难理解在集群模式下Docker是如何工作的,特别是考虑到“副本”和“负载平衡”机制。
假设我有5台不同的Docker机器,每台机器都有不同的公网IP,参与一个Swarm。我还有一个跨这5台不同机器复制的web服务和db服务(每台机器一个实例)。
我的问题是:我如何让5个web容器中的任何一个与5个db_mysql容器中的任何一个通信,而不强制这些web容器知道任何Docker Machine公共IP或这些容器生活在群中的事实?
发布于 2019-03-07 17:17:23
您可以使用服务名称。这将在DNS中解析为VIP或服务的5个ip地址(每个副本一个)。在幕后,VIP使用IPVS循环调度到一个健康的副本,而不会受到陈旧的DNS问题的困扰。即使使用默认的VIP,您也可以使用service_name.tasks获取所有副本IP地址。
在Docker的DNS实现中,您可以解析容器名称,以及任何网络别名。网络别名包括带有DNSRR的服务名称(由不带swarm的docker-compose使用)。或者在群模式下将业务名称解析为VIP。容器的主机名不能解析,可能是因为它可以在docker引擎的控制(从而知识)之外更改。
https://stackoverflow.com/questions/55039198
复制相似问题