Docker for Windows:使用相同的端口号在本地启动多个 docker 容器

Docker for Windows: Spinning up multiple docker containers locally with same port numbers

我正在为 Windows 使用 Docker 桌面(使用 Hyper-V,而不是 Docker Windows 的工具包)。我想要完成的是启动 3+ docker 个容器,并使用相同的端口集。

创建第一个 docker 容器后,我有 http://docker:8091(或 http://10.0.75.2:8091)可用,这很好。现在,我想要做的是启动另一个具有相同端口号的容器。因此,类似于 http://docker2:8091http://10.0.75.3:8091)。然后另一个位于 docker3 或 *.4:8091.

(请注意,启动三个将暴露端口重新分配给其他随机端口的容器是小菜一碟,但我想保留端口号)。

我尝试通过 Hyper-V 管理器向 MobyLinuxVM 添加网络适配器,但这似乎无法正常工作 Docker,我必须重新安装才能使其再次运行。

我已经尝试使用 docker-machine (docker-machine create -d hyperv --hyperv-virtual-switdch DockerNAT AnotherBox) 启动另一个 Hyper-V 实例,但它只是在中途锁定并且不起作用。 (根据我在论坛上阅读的内容,docker-machine on Docker for Windows 的意图对我来说无论如何都无法做到这一点,它只是为了管理云中的虚拟机)。

所以...有什么方法可以完成我想做的事情吗?

是的,有一种方法,就是使用反向代理。您可以在容器内使用 Nginx 或 HAProxy,或者更简单,您可以使用自动重新配置自身的 Nginx 映像来反向代理您的容器:https://hub.docker.com/r/jwilder/nginx-proxy/.

为了发布端口,docker 使用二进制 docker-proxy 转发到容器中,有效如:

docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091

很明显,它绑定到本例中的所有接口,但我认为可以绑定到特定接口。

假设您的主机上有 3 个接口,并且有适当的 DNS 记录,那么可以这样做:

docker-proxy -proto tcp -host-ip 10.0.75.2 -host-port 8091 -container-ip 172.17.0.2 -container-port 8091
docker-proxy -proto tcp -host-ip 10.0.75.3 -host-port 8091 -container-ip 172.17.0.3 -container-port 8091
docker-proxy -proto tcp -host-ip 10.0.75.4 -host-port 8091 -container-ip 172.17.0.4 -container-port 8091