我已经创建了我的第一个Docker容器,它使用Go运行服务器,但是无法从主机外部访问它。我刚开始使用docker,所以在这里有点迷路了。
因此,我有一个非常简单的Go代码来启动服务器,我已经构建了Docker映像,该映像安装了Go并在Linux基本映像中构建了代码。我在端口8080上运行服务器,因此我将该端口公开给运行容器的主机,如下所示:
docker run -p 8080:8080 dockertest
那行得通,我可以通过Docker的机器IP(启动时出现在Docker Quickstart Terminal上的机器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(localhost),但结果却是相同的:无法通过任何方式访问该网站IP。
我已经搜索了这个问题,发现了很多StackOverflow问题,但都没有帮助我解决问题,大多数问题都针对Linux或Mac,因此该解决方案不适用于我的情况。
另外,我可以在计算机上运行Go代码,并通过计算机的IP从同一网络中的另一台设备访问网站。我不明白为什么在docker机器上运行它时无法访问它,我想到它可能与IP转发有关,但我是一个完全的网络专家,我我主要是一名Web开发人员,几乎没有本地经验。
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地址在网络上的其他计算机应该是可见的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句