我创建了我的第一个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容器)。
bridged
听起来您的困惑在于连接到哪个主机以便通过HTTP访问您的应用程序。您还没有真正弄清楚您的配置是什么-我将基于您的标记中包含“ Windows”和“ VirtualBox”的事实做出一些猜测。
我猜您在Windows主机上的VirtualBox中运行的某种Linux上运行了Docker。我将如下标记IP地址:
D = Docker容器的IP地址
D
L =在VirtualBox中运行的Linux主机的IP地址
L
W = Windows主机的IP地址
W
在Windows主机上运行Go应用程序时,可以http://W:8080/从本地网络上的任何位置连接到该应用程序。之所以可行,是因为Go应用程序绑定了Windows计算机上的端口8080,并且任何尝试访问IP地址上的端口8080的人都W将建立连接。
http://W:8080/
这就是它变得更加复杂的地方:
VirtualBox设置虚拟机(VM)时,可以以几种不同模式之一配置网络。我不记得所有不同的选项是什么,但是您想要的是bridged。在这种模式下,VirtualBox会将虚拟机连接到本地网络,就像虚拟机是网络上的独立计算机一样,就像插入网络中的任何其他计算机一样。在bridged模式下,虚拟机会像其他任何计算机一样出现在您的网络上。其他模式设置的方式有所不同,并且计算机将在您的网络上不可见。
因此,假设您为Linux主机(bridged)正确设置了网络连接,则Linux主机将在您的本地网络上具有IP地址(如192.168.0.x之类),并且您可以在处访问Docker容器http://L:8080/。
http://L:8080/
如果将Linux主机设置为以外的其他模式bridged,则 可以 从Windows主机进行访问,但这将取决于它所处的模式。
编辑 -根据以下评论,听起来很像我上面描述的情况是正确的。
让我们备份一点:这是Docker在我的计算机(Ubuntu Linux)上的工作方式。
Imagine I run the same command you have: docker run -p 8080:8080 dockertest. What this does is start a new container based on the dockertest image and forward (connect) port 8080 on the Linux host (my PC) to port 8080 on the container. Docker sets up it’s own internal networking (with its own set of IP addresses) to allow the Docker daemon to communicate and to allow containers to communicate with one another. So basically what you’re doing with that -p 8080:8080 is connecting Docker’s internal networking with the “external” network - ie. the host’s network adapter - on a particular port.
dockertest
-p 8080:8080
到目前为止和我在一起?好的,现在让我们退后一步,看看您的系统。您的计算机正在运行Windows- Docker(当前)不在Windows上运行,因此您使用的工具已在VirtualBox虚拟机中设置了Linux主机。当你做docker run你的环境,同样的事情发生了- 8080端口在Linux主机上连接到端口8080的容器上。这里最大的区别是您的Windows主机不是运行容器的Linux主机,因此这里有另一层,并且跨该层的通信会遇到问题。
docker run
您需要做的是以下两件事之一:
将VirtualBox VM上的端口8080连接到Windows主机上的端口8080,就像将Docker容器连接到主机端口一样。
使用上述bridged网络模式将VirtualBox VM直接连接到本地网络。
如果您选择第一个选项,则可以访问Windows主机的IP地址或主机名http://W:8080所在的容器W。如果选择第二个,则可以访问Linux VM的IP地址或主机名http://L:8080所在的容器L。
http://W:8080
http://L:8080
这就是所有更高层次的说明-现在您需要弄清楚如何更改VirtualBox VM的配置。这是我无法真正为您提供帮助的地方- 我不知道您在Windows机器上使用什么工具来完成所有这些工作,而且我对在Windows上使用Docker一点都不熟悉。
如果可以进入VirtualBox配置窗口,则可以进行以下描述的更改。还有一个命令行客户端将修改VM,但是我对此并不熟悉。
对于bridged模式(这确实是最简单的选择),请关闭您的VM,单击顶部的“设置”按钮bridged,然后将网络模式更改为,然后重新启动VM,您就可以了。VM应该通过DHCP在本地网络上选择一个IP地址,并且对于该IP地址在网络上的其他计算机应该是可见的。