公共IP映射到Docker中的内部共享虚拟IP地址

我在OSX上使用Docker,并创build了一个具有桥接networking和多个共享虚拟IP的容器的主机(因此172.19.0.50指向172.19.0.1,如果该容器closures,则172.19.0.50指向172.19。 0.2等)。 这个networking中的其他容器可以访问172.19.0.50,并且可以按照计划看到其中的任何一个,到目前为止是非常棒的。

我很困惑的是如何指向我的公共192.168.99.100 IP,使它到172.19.0.50,而不是一个特定的容器IP。

这是我不太熟悉的一个领域,所以任何build议非常赞赏。

经过一番研究,在我看来,目前没有“docker解决scheme”。 我有完全相同的问题:我有1个docker主机上的3个容器的galera群集。 假设您需要访问容器上的端口3306,就像我一样。 我在这些加莱拉节点上pipe理一个虚拟的IP,而且效果很好。 但是我不能告诉Docker匹配端口的主机(在我的情况下为3306)到virtual_ip:3306。 主机的端口必须映射到容器和端口。 不是IP地址。 如果你运行具有虚拟IP的容器,像这样的端口映射:

 docker run -d -p 3306:3306 docker_image /bin/bash 

在3306上对公共主机IP地址的请求将被redirect到你的容器networking接口的端口3306(理论上有两个地址,一个静态的和一个虚拟的)。 但是,如果您的虚拟IP移动到另一个泊坞窗,它不会改变任何东西到您的端口映射。 无论如何,来自外部的请求将被redirect到第一个容器。 (顺便说一下,你不能将多个容器映射到同一个docker主机的端口,实际上,它不会有帮助)

在我看来,您可以在容器中使用HAProxy或Nginx反向代理:因此您可以将3306的主机端口映射到HAProxy的3306端口,并且HAProxy可以将您的请求redirect到群集(带有或不带负载平衡)。 所以现在你甚至不需要虚拟IP。 但是,现在你有一个很好的单点失败。 将另一个反向代理添加为备份会很好,但是您需要一个虚拟IP来进行故障转移,并且您会被困在开始的问题中。

如果有人有更好的解决scheme…