首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从主机外部连接到码头容器(同一网络) [Windows]

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

Stack Overflow用户
提问于 2015-11-19 21:28:43
回答 8查看 208.4K关注 0票数 112

我已经创建了我的第一个码头容器,它正在使用Go运行服务器,但我无法从主机外部访问它。我刚从码头开始,所以我有点迷路了。

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

代码语言:javascript
复制
docker run -p 8080:8080 dockertest

这是可行的,我可以通过Docker的机器IP (启动时出现在码头快速启动终端上的机器)访问服务器,问题是我无法访问我在主机外部托管的网站,,所以如果我试图在我的手机上打开相同的IP地址,它只会给我一个错误:这个网页是不可用的(ERR_CONNECTION_TIMED_OUT)。

我也尝试过这样指定IP:

代码语言:javascript
复制
docker run -p 192.168.0.157:8080:8080 dockertest

但是当我这样做时,我既不能通过码头机器的IP访问网站,也不能通过上面命令行上指定的IP访问该网站。我也不知道我应该写哪个IP命令,我使用了我的计算机的IP,我也尝试了127.0.0.1 (本地主机),但这给了我同样的结果:不能通过任何IP访问网站。

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

此外,我还可以在我的电脑上运行Go代码,并通过我的计算机的IP从同一网络中的另一个设备访问该网站。我不明白为什么当我在码头机器上运行它时,我不能访问它,我突然意识到,它可能与IP转发有关,但我是一个完全的网络新手,我主要是一个web开发人员,几乎没有本地的经验。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-11-19 21:46:54

TL;博士检查您的VirtualBox主机的网络模式-如果您希望在本地网络上访问虚拟机(以及它所在的Docker容器),则应该是bridged。

听起来,您的困惑就在于要通过HTTP访问应用程序要连接到哪个主机。您还没有真正说明您的配置是什么-我将作出一些猜测,根据事实,您有"VirtualBox“和”VirtualBox“在您的标签。

我猜您已经让Docker在Windows主机上运行在VirtualBox中了。我将给IP地址贴上如下标签:

D =码头容器的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访问,但这将取决于它所处的模式。

编辑-基于下面的注释,听起来非常像是我上面描述的情况是正确的。

让我们回顾一下:下面是Docker在我的计算机(Ubuntu )上的工作方式。

假设我运行的命令与您拥有的相同:docker run -p 8080:8080 dockertest。这样做是基于dockertest映像启动一个新容器,并在Linux主机(我的PC)上将端口8080转发到容器上的端口8080。Docker设置自己的内部网络(拥有自己的IP地址集),以允许Docker守护进程进行通信,并允许容器彼此通信。因此,基本上,您使用该-p 8080:8080所做的是将Docker的内部网络连接到“外部”网络--即。主机的网络适配器-在特定端口上。

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

你需要的是两件事中的一件:

  1. 要将VirtualBox VM上的端口8080连接到Windows主机上的端口8080,就像将Docker容器连接到主机端口一样。
  2. 要将VirtualBox VM直接连接到您的本地网络,可以使用我前面描述的bridged网络模式。

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

这就是所有更高层次的解释--现在您需要弄清楚如何更改VirtualBox VM的配置。这是我不能真正帮助你的地方--我不知道你用什么工具在你的Windows机器上做这一切,而且我对在Windows上使用Docker一点也不熟悉。

如果可以访问VirtualBox配置窗口,则可以进行以下更改。还有一个命令行客户机可以修改‘m,但我对此并不熟悉。

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

票数 102
EN

Stack Overflow用户

发布于 2016-04-06 17:27:54

  1. 打开Oracle管理器
  2. 选择Docker使用的VM
  3. 单击“设置->网络”
  4. 适配器1应该(默认吗?)“附属于: NAT”
  5. 单击高级->端口转发
  6. 添加规则:协议TCP、主机端口8080、来宾端口8080 (主机IP和访客IP空)
  7. 客人是你的码头集装箱,主机是你的机器

您现在应该可以通过localhost:8080和您的内部-ip:8080浏览到您的容器。

票数 134
EN

Stack Overflow用户

发布于 2017-11-14 12:02:55

在尝试了几件事之后,这件事对我起了作用:

  • 使用-publish=0.0.0.0:8080:8080停靠标志
  • 将virtualbox网络模式设置为NAT,并且不使用任何端口转发

除了0.0.0.0以外,我的地址也没有成功。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33814696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档