如何从主机外部(同一网络)连接到 Docker 容器 [Windows]
如何从主机外部(同一网络)连接到 Docker 容器 [Windows]
我创建了我的第一个Docker容器,它正在使用Go运行服务器,但是我无法从主机外部访问它。我刚刚开始使用Docker,所以在这里有点迷茫。
所以我有一个非常简单的Go代码,它启动了一个服务器,我构建了Docker镜像,安装了Go并在Linux基础映像中构建了代码。我在端口8080上运行服务器,因此我将其暴露给运行容器的主机,如下所示:
docker run -p 8080:8080 dockertest
这可行,我可以通过Docker启动终端显示的Docker机器IP访问服务器,但问题是我不能从主机外部访问托管的网站,因此如果我尝试在手机上打开相同的IP地址,它只是给我一个错误:此网页不可用( ERR_CONNECTION_TIMED_OUT)。
我还尝试通过以下方式指定IP:
docker run -p 192.168.0.157:8080:8080 dockertest
但是当我这样做时,我无法通过上面的命令行访问网站,并且我也不能通过Docker机器的IP或指定的IP访问该网站。
我也不确定我应该在该命令中写什么IP,我使用了我的计算机IP,我还尝试了127.0.0.1(本地主机),但是结果相同:无法通过任何IP访问该网站。
我在谷歌上搜索了这个问题并找到了很多StackOverflow的问题,但是没有一个能帮助我解决我的问题,大多数问题都是面向Linux或Mac,因此解决方案不适用于我的情况。
另外,我也可以在我的计算机上运行Go代码,并通过我的计算机IP在同一网络中的另一台设备访问该网站。我不明白为什么我在Docker机器上运行它时无法访问它,我想这可能与IP转发或其他事情有关,但我是网络方面的完全新手,我主要是web开发人员,几乎没有本地经验。
TL;DR 如果要让虚拟机以及其托管的 Docker 容器可以在本地网络上访问,您需要检查 VirtualBox 主机的网络模式并将其设置为桥接模式
。
你说您不知道如何连接到HttpResponse,我的理解是您不清楚是从哪个主机连接您的应用程序来访问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主机访问,但这将取决于它使用的确切模式。
编辑 - 根据下面的评论,似乎我上面描述的情况是正确的。
让我们回到一点:这是在我的电脑(Ubuntu Linux)上运行 Docker 的方式:
假设我运行与您相同的命令: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 VM 上的端口 8080 连接到 Windows 主机上的端口 8080,就像你将 Docker 容器连接到主机端口一样。
-
使用我上面描述过的
bridged
网络模式将 VirtualBox VM 直接连接到你的本地网络。
如果你选择第一种方案,你将能够在 http://W:8080
访问容器,其中 W
是 Windows 主机的 IP 地址或主机名。如果你选择第二种方案,你将能够在 http://L:8080
访问容器,其中 L
是 Linux VM 的 IP 地址或主机名。
那么,这就是所有的高层解释 - 现在你需要找出如何更改 VirtualBox VM 的配置。这就是我不能真正帮助你的地方 - 我不知道你在 Windows 机器上使用什么工具来完成所有这些操作,而且我对在 Windows 上使用 Docker 完全不熟悉。如果你可以进入 VirtualBox 配置窗口,你可以进行以下更改。也有一个命令行客户端可用于修改虚拟机,但我对此不熟悉。
对于 bridged
模式(这真的是最简单的选择),关闭你的 VM,在顶部点击 "设置" 按钮,将网络模式更改为 bridged
,然后重新启动 VM 即可。VM 应该会通过 DHCP 在你的本地网络上获取一个 IP 地址,并在该 IP 地址上对其他计算机可见。