TL;DR:检查您的VirtualBox主机的网络模式 - 如果您希望虚拟机(及其托管的Docker容器)可以在本地网络上访问,则应该使用bridged
。
你的困惑似乎在于要连接哪个主机才能通过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地址W
的端口8080的人都会被连接到它。
现在问题变得更加复杂:
VirtualBox设置虚拟机(VM)时,可以配置多种不同的网络模式。我不记得所有不同的选项是什么,但您想要的是bridged
。在此模式下,VirtualBox将虚拟机连接到您的本地网络,就像它是网络上的独立机器一样,就像任何其他插入到您的网络中的机器一样。在bridged
模式下,虚拟机就像任何其他机器一样出现在您的网络上。使用其他模式会设置不同的东西,该机器将无法在您的网络上可见。
假设你正确设置了 Linux 主机的网络(bridged
),则 Linux 主机将在您的本地网络上拥有一个 IP 地址(类似于 192.168.0.x),您可以通过 http://L:8080/
访问 Docker 容器。
如果 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
时,正发生着完全相同的事情 - Linux 主机上的端口 8080 连接到容器上的端口 8080。这里的重大区别在于,您的 Windows 主机不是运行容器的 Linux 主机,因此在跨越此层进行通信时会遇到问题。
您需要以下两个选项之一:
若要将VirtualBox虚拟机的8080端口连接到Windows主机的8080端口,就像您将Docker容器连接到主机端口一样。
若要使用上述所述的"桥接"网络模式直接将VirtualBox虚拟机连接到本地网络,请选择第二个选项。
如果您选择第一个选项,则可以通过http://W:8080
访问容器,其中W
是Windows主机的IP地址或主机名。如果您选择第二个选项,则可以通过http://L:8080
访问容器,其中L
是Linux虚拟机的IP地址或主机名。
这就是所有的高级别解释 - 现在您需要弄清如何更改VirtualBox VM的配置。这就是我无法真正帮助您的地方 - 我不知道您在Windows机器上使用什么工具来完成所有这些操作,并且我对在Windows上使用Docker毫不熟悉。
如果您可以进入VirtualBox配置窗口,则可以进行下面描述的更改。还有一种命令行客户端可以修改VMs,但我不熟悉它。
对于 bridged
模式(这确实是最简单的选择),关闭VM,单击顶部的"设置"按钮,将网络模式更改为 bridged
,然后重新启动VM即可。虚拟机应该通过DHCP在本地网络上获取一个IP地址,并且应该在该IP地址上对其他计算机可见。