Docker:如何(反向)转发端口以允许访问主机的本地主机:PORT?

4
我想让一个 Docker 虚拟机连接到在 Windows 上运行的 Docker 的本地主机上的端口。
Docker 提供了端口转发功能,但我认为只能将 Docker 虚拟机的端口暴露给运行虚拟机的主机。
在启动 Docker 时,也可以将主机名映射到 IP 地址,但同样只能在虚拟机中看到。
因此,以下选项都没有帮助:
docker run \ 
    --add-host host:127.0.0.1 \
    -p 6000:6000 \
    OTHER_ARGUMENTS

我的当前目的是将运行在Windows主机上的XServer端口暴露给虚拟机。我的当前解决方案是找到Windows主机IP,但当网络发生变化时,该IP不再有效,并且XServer显然没有在新IP上进行监听。
这种情况发生在计算机休眠并在唤醒时连接到新网络时。
相比之下,ssh 提供了 -L-R 选项,允许双向转发 IP/端口。
可能的解决方案是以分离模式启动容器,在其中进行 ssh 并设置端口转发,并在另一个 docker 运行中完成所有其他工作。
另一种可能的解决方案是 设置 NAT 服务器(我没有尝试过)。
在 VM 中使用 host.docker.internal 可能是一个解决方案 - 我开始测试它是否经久耐用。对于初始连接它确实有效(我将 DISPLAY 设置为 host.docker.internal:0.0)。(host-gateway 可能需要更多的调查)。
不隔离地运行 (选项 --net host)。未经测试。

所以我的问题是,有哪些方法可以让 docker VM 访问 Windows HOST 的本地主机地址(127.0.X.X)上的端口。

一个不太一般的问题是:如何在 Windows 主机和 docker 运行中设置 DISPLAY/Xserver,以便它们始终正常工作,即使在更改网络后也是如此。

请注意,我的主机操作系统是Windows 10(在*nix上可能更容易实现)。
1个回答

1

在提出的各种可能性中,至少在Windows平台上,最好的解决方案是将DISPLAY设置为host.docker.internal:0.0.

docker可以通过直接设置此选项来启动:

   docker -e DISPLAY=host.docker.internal:0.0 <OTHERARGUMENTS>

我验证了``通过启动一个netcat会话连接到本地主机。
在Windows主机上(使用cygwin),我启动了:
nc -l 127.0.0.1 3000

我可以通过以下方式从虚拟机连接到它:

telnet host.docker.internal 3000

当使用以下命令启动netcat守护进程时:
nc -l 169.254.11.167 3000

虚拟机中的telnet到本地主机失败,需要使用telnet 169.254.11.167 3000

因此,在Windows主机上,host.docker.internal(在我测试的VM内部为168.168.65.2)对应于本地主机(而不是运行docker容器的WSL实例的本地主机)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接