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

我创建了我的第一个docker容器,它运行一个服务器使用Go,但我无法从主机外部访问它。我刚刚开始docker,所以我有点失落在这里。

所以我有一个非常简单的Go代码启动一个服务器,我已经构建了docker镜像,安装Go并在Linux基础镜像中构建代码。我在端口8080上运行服务器,所以我将该端口暴露给运行容器的主机,如下所示:

docker run -p 8080:8080 dockertest

这工作,我得到访问服务器通过docker的机器IP(启动时出现在Docker Quickstart终端上的一个),问题是我无法访问我从主机外面托管的网站,所以如果我尝试在我的手机上打开相同的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(localhost),但是给了我相同的结果:无法访问网站通过任何IP无论如何。

我已经google了这个问题,发现了许多stackoverflow问题,但都没有帮助我解决我的问题,大多数是面向Linux或Mac,所以解决方案不适用于我的情况。

此外,我可以在我的计算机上运行Go代码,并通过计算机的IP从同一网络中的其他设备访问网站。我不明白为什么我不能访问它,当我在docker机器上运行它,它发生在我,它可能与IP转发或某些东西,但我是一个完整的noob在网络,我主要是一个Web开发人员,几乎没有本地的经验。

最佳答案
TL; DR检查VirtualBox主机的网络模式 – 如果您希望虚拟机(和托管的Docker容器)可以在本地网络上访问,则应该桥接它。

听起来你的困惑在于哪个主机连接到为了通过HTTP访问您的应用程序。你没有真正地阐明你的配置是什么 – 我会做一些猜测,基于你有“Windows”和“VirtualBox”在你的标签。

我猜你有Docker运行在一些风格的Linux上运行在Windows主机上的VirtualBox。我要标记IP地址如下:

D = Docker容器的IP地址

L =在VirtualBox中运行的Linux主机的IP地址

W = Windows主机的IP地址

当您在Windows主机上运行Go应用程序时,您可以使用http:// W:8080 /从本地网络上的任何位置连接到它。这是因为Go应用程序绑定在Windows机器上的端口8080,任何人试图访问端口8080在IP地址W将被连接。

这里是它变得更复杂:

VirtualBox在设置虚拟机(VM)时,可以将网络配置为几种不同模式之一。我不记得什么所有不同的选项是,但你想要的是桥接。在此模式下,VirtualBox将虚拟机连接到本地网络,就像它是网络上的独立计算机一样,就像插入到网络中的任何其他计算机一样。在桥接模式下,虚拟机像任何其他机器一样显示在网络上。其他模式设置不同,机器将不会在您的网络上可见。

因此,假设您为Linux主机(桥接)正确设置网络,Linux主机将在您的本地网络(类似192.168.0.x)上有一个IP地址,您将能够访问您的Docker容器:http: // L:8080 /。

如果Linux主机设置为除桥接以外的某种模式,您可能能够从Windows主机访问,但这将取决于它在什么模式。

编辑 – 基于以下评论,它听起来很像我上面描述的情况是正确的。

让我们回顾一下:这里是Docker在我的电脑(Ubuntu Linux)上的工作原理。

想象我运行相同的命令你有:docker run -p 8080:8080 dockerest。这是做一个新的容器基于dockerest映像和转发(连接)端口8080在Linux主机(我的PC)上的容器上的端口8080。 Docker设置了自己的内部网络(具有自己的一组IP地址),以允许Docker守护程序进行通信,并允许容器相互通信。所以基本上你在做什么-p -p 8080:8080是连接Docker的内部网络与“外部”网络 – 即。主机的网络适配器 – 在特定端口。

跟我到目前为止?好的,现在让我们退一步看看你的系统。您的计算机正在运行Windows – Docker(目前)不在Windows上运行,因此您使用的工具已在VirtualBox虚拟机中设置了Linux主机。当你在你的环境中运行docker时,发生同样的事情 – Linux主机上的8080端口连接到容器上的端口8080。这里的最大区别是,你的Windows主机不是运行容器的Linux主机,所以这里有另一个层,它在这个层上进行通信,在这里你遇到了问题。

你需要的是两件事之一:

>将VirtualBox VM上的端口8080连接到Windows主机上的端口8080,就像将Docker容器连接到主机端口一样。
>使用上述桥接网络模式将VirtualBox VM直接连接到本地网络。

如果选择第一个选项,您将能够访问http:// W:8080的容器,其中W是Windows主机的IP地址或主机名。如果选择第二个,您将能够访问http:// L:8080上的容器,其中L是Linux VM的IP地址或主机名。

所以这是所有的更高层次的解释 – 现在你需要找出如何更改VirtualBox VM的配置。这里是我不能真正帮助你 – 我不知道你使用什么工具来做所有这些在Windows机器上,我不熟悉在Windows上使用Docker。

如果可以进入VirtualBox配置窗口,可以进行下面所述的更改。还有一个命令行客户端将修改VM,但我不熟悉。

对于桥接模式(这确实是最简单的选择),关闭VM,单击顶部的“设置”按钮,然后将网络模式更改为桥接模式,然后重新启动VM,您就可以开始使用。 VM应该通过DHCP在本地网络上获取IP地址,并且该IP地址上的网络上的其他计算机应该可以看到。

转载注明原文:如何从主机外部连接到docker容器(同一网络)[Windows] - 代码日志