代码之家  ›  专栏  ›  技术社区  ›  le_top

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

  •  0
  • le_top  · 技术社区  · 3 年前

    我想启用一个docker虚拟机来连接到windows上启动docker的主机的本地主机上的端口。

    docker 建议端口转发,但IMHO仅将docker的VM端口暴露给运行VM的主机。

    在启动docker时,也可以将主机名映射到IP地址,但同样,这只能在VM上看到。 因此,以下两个选项都没有帮助:

    docker run \ 
        --add-host host:127.0.0.1 \
        -p 6000:6000 \
        OTHER_ARGUMENTS
    

    我目前的目的是将运行在Windows主机上的XServer端口公开给VM。我目前的解决方案是找到一个Windows主机IP,但当网络发生变化时,该IP不再有效,XServer显然没有监听新的IP。
    这种情况发生在计算机休眠时,当它醒来时处于新网络上。

    相比之下, ssh 提供了 -L -R 允许以任何方式转发IP/端口的选项。
    一种可能的解决方案可以是以分离模式启动容器, ssh 到它并设置端口转发,并在另一个中完成所有其他工作 码头工人
    另一种可能的解决方案是 setup a NAT server (我没有尝试)。
    使用 host.docker.internal 在虚拟机中可能是一个解决方案——我开始测试它,看看它是否会随着时间的推移而保持。它确实适用于初始连接(我将DISPLAY设置为 host.docker.internal:0.0 ). ( host-gateway 可能需要更多的调查)。
    无隔离运行(选项 --net host ). 未经测试。

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

    一个不太普遍的问题是:如何在Windows主机和docker上设置DISPLAY/X服务器,以便它们始终工作,即使在更改网络后也是如此。

    请注意,我的主机操作系统是Windows 10(这可能在*nix上更容易做到)。

    0 回复  |  直到 3 年前
        1
  •  1
  •   le_top    2 年前

    在建议的可能性中,至少在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 deamon使用

    nc -l 169.254.11.167 3000
    

    从VM到localhost的telnet没有成功, telnet 169.254.11.167 3000 是必需的。

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