经过一些研究,在我看来,目前没有“码头解决方案”。我有完全相同的问题:我在 1 个 docker 主机上的 3 个容器上有一个 galera 集群。假设您需要像我一样访问容器上的 3306 端口。我在这些 galera 节点上管理一个虚拟 IP,效果很好。但是我不能告诉 Docker 将端口的主机(在我的 mysql 中为 3306)与 virtual_ip:3306 匹配。主机的端口必须映射到容器和端口。不是IP地址。如果您运行具有虚拟 IP 的容器,则端口映射如下:
docker run -d -p 3306:3306 docker_image /bin/bash
对 3306 上的公共主机 IP 地址的请求将被重定向到容器网络接口的端口 3306(理论上有 2 个地址,一个静态地址和一个虚拟地址)。但是,如果您的虚拟 IP 移动到另一个 docker,它不会改变您的端口映射。无论如何,来自外部的请求将被重定向到第一个容器。(顺便说一句,您不能将多个容器映射到同一个 docker 主机的端口。实际上,这无济于事)
在我看来,您可以在容器中使用 HAProxy 或 Nginx 反向代理:因此您可以将 3306 的主机端口映射到 HAProxy 的 3306 端口,并且 HAProxy 可以将您的请求重定向到集群(有或没有负载平衡)。所以现在你甚至不需要虚拟 IP。但是,现在你有一个很好的单点故障。添加另一个反向代理作为备份会很好,但是您将需要一个虚拟 IP 进行故障转移,并且您会遇到一开始的问题。
如果有人对此有更好的解决方案...