如何从主机外部(同一网络)连接到 Docker 容器 [Windows]

52 浏览
0 Comments

如何从主机外部(同一网络)连接到 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开发人员,几乎没有本地经验。

admin 更改状态以发布 2023年5月25日
0
0 Comments

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 主机,所以在这个层次上进行通信时,你遇到了问题。

你需要的是以下两种方案之一:

  1. 将 VirtualBox VM 上的端口 8080 连接到 Windows 主机上的端口 8080,就像你将 Docker 容器连接到主机端口一样。

  2. 使用我上面描述过的 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 地址上对其他计算机可见。

0
0 Comments
  1. 打开Oracle VM VirtualBox Manager
  2. 选择Docker所使用的虚拟机
  3. 点击设置 -> 网络
  4. 适配器1应该(默认是)“连接到:NAT”
  5. 点击高级选项 -> 端口转发
  6. 添加规则:协议TCP,主机端口8080,客户端端口8080(主机IP和客户端IP留空)
  7. 客户端是你的Docker容器,主机是你的电脑

现在你应该可以通过localhost:8080和你的内部IP:8080浏览到你的容器了。

0