TL; DR检查VirtualBox主机的网络模式-是否应该bridged
在本地网络上访问虚拟机(及其托管的Docker容器)。
听起来您的困惑在于连接到哪个主机以便通过HTTP访问您的应用程序。您还没有真正弄清楚您的配置是什么-基于您的标记中包含“ Windows”和“ VirtualBox”的事实,我将做出一些猜测。
我猜您在Windows主机上的VirtualBox中运行的某种Linux操作系统上运行了Docker。我将如下标记IP地址:
D
= Docker容器的IP地址
L
=在VirtualBox中运行的Linux主机的IP地址
W
= Windows主机的IP地址
在Windows主机上运行Go应用程序时,可以http://W:8080/
从本地网络上的任何位置连接到该应用程序。之所以可行,是因为Go应用程序绑定了Windows计算机上的端口8080,并且任何尝试访问IP地址上的端口8080的人都W
将建立连接。
这就是它变得更加复杂的地方:
VirtualBox设置虚拟机(VM)时,可以以几种不同模式之一配置网络。我不记得所有不同的选项是什么,但是您想要的是bridged
。在这种模式下,VirtualBox会将虚拟机连接到本地网络,就像虚拟机是网络上的独立计算机一样,就像插入到网络中的任何其他计算机一样。在bridged
模式下,虚拟机会像其他任何计算机一样出现在您的网络上。其他模式设置的方式有所不同,并且计算机将在您的网络上不可见。
因此,假设您为Linux主机(bridged
)正确设置了网络连接,则Linux主机将在您的本地网络上具有IP地址(例如192.168.0.x之类),并且您可以通过访问Docker容器http://L:8080/
。
如果Linux主机设置为以外的其他模式bridged
,则可以从Windows主机进行访问,但这将取决于它所处的模式。
编辑-根据以下评论,听起来很像我上面描述的情况是正确的。
让我们做些备份:这是Docker在我的计算机(Ubuntu Linux)上的工作方式。
假设我运行与您相同的命令:docker run -p 8080:8080 dockertest
。这样做是根据dockertest
映像启动一个新容器,并将Linux主机(我的PC)上的端口8080转发(连接)到容器上的端口8080。Docker设置了自己的内部网络(具有自己的IP地址集),以允许Docker守护进程进行通信并允许容器相互通信。因此,基本上,您要做的-p 8080:8080
就是将Docker的内部网络与“外部”网络连接-即。主机的网络适配器-在特定端口上。
到目前为止和我在一起?好的,现在让我们退后一步,看看您的系统。您的计算机正在运行Windows-Docker(当前)不在Windows上运行,因此您使用的工具已在VirtualBox虚拟机中设置了Linux主机。当你做docker run
你的环境,同样的事情发生了- 8080端口在Linux主机上连接到端口8080的容器上。这里最大的区别是您的Windows主机不是运行容器的Linux主机,因此这里还有另一层,并且跨该层的通信会遇到问题。
您需要做的是以下两件事之一:
将VirtualBox VM上的端口8080连接到Windows主机上的端口8080,就像将Docker容器连接到主机端口一样。
使用上述bridged
网络模式将VirtualBox VM直接连接到本地网络。
如果您选择第一个选项,则可以访问Windows主机的IP地址或主机名http://W:8080
所在的容器W
。如果选择第二个,则可以访问Linux VM的IP地址或主机名http://L:8080
所在的容器L
。
这就是所有更高层次的说明-现在您需要弄清楚如何更改VirtualBox VM的配置。这是我无法真正为您提供帮助的地方-我不知道您使用什么工具在Windows机器上执行所有这些操作,而且我对在Windows上使用Docker一点也不熟悉。
如果可以进入VirtualBox配置窗口,则可以进行以下描述的更改。还有一个命令行客户端将修改VM,但是我对此并不熟悉。
对于bridged
模式(这确实是最简单的选择),请关闭您的VM,单击顶部的“设置”按钮bridged
,然后将网络模式更改为,然后重新启动VM,您就可以了。VM应该通过DHCP在本地网络上选择一个IP地址,并且对于该IP地址在网络上的其他计算机应该是可见的。