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

时间:2015-11-19 21:28:44

标签: windows docker virtualbox

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

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

docker run -p 8080:8080 dockertest

可行,我可以通过docker的机器IP (启动时出现在 Docker Quickstart Terminal 上的那个)访问服务器,问题是我无法访问我在主机外部托管的网站,所以如果我尝试在手机上打开相同的IP地址,则只会给我一个错误:此网页不可用(ERR_CONNECTION_TIMED_OUT)。< / p>

我也试过像这样指定IP:

docker run -p 192.168.0.157:8080:8080 dockertest

但是当我这样做时,我可以通过上面的命令行上的docker机器的IP和指定的IP访问该网站。 我也不确定我应该在该命令中使用我的计算机IP写入哪个IP,我也尝试过127.0.0.1(localhost),但这给了我相同的结果:无法访问任何网站知识产权无论如何。

我已经搜索了这个问题,发现了许多StackOverflow问题但是没有帮助我解决我的问题,其中大多数都面向Linux或Mac,因此解决方案不适用于我的情况。

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

8 个答案:

答案 0 :(得分:97)

  1. 打开Oracle VM VirtualBox Manager
  2. 选择Docker使用的VM
  3. 点击设置 - &gt;网络
  4. 适配器1应该(默认?)是“附加到:NAT”
  5. 点击高级 - &gt;港口转发
  6. 添加规则:协议TCP,主机端口8080,访客端口8080(保留主机IP和访客IP为空)
  7. Guest是您的docker容器,Host是您的计算机
  8. 您现在应该可以通过localhost:8080和your-internal-ip:8080浏览到您的容器。

答案 1 :(得分:72)

TL; DR 检查VirtualBox主机的网络模式 - 如果您希望可以访问虚拟机(以及它托管的Docker容器),则应该是bridged你的本地网络。

听起来你的困惑在于连接哪个主机以便通过HTTP访问你的应用程序。你还没有真正说明你的配置是什么 - 我会做出一些猜测,这是基于你已经拥有&#34; Windows&#34;和&#34; VirtualBox&#34;在你的标签中。

我猜你在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主机访问,但这将取决于它的确切模式&# 39; s in。

编辑 - 根据以下评论,听起来非常像我上面描述的情况是正确的。

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

想象一下,我运行的命令是docker run -p 8080:8080 dockertest。这样做是基于dockertest映像和Linux主机(我的PC)上的前向(连接)端口8080启动一个新容器到容器上的端口8080。 Docker建立了自己的内部网络(具有自己的一组IP地址),以允许Docker守护程序进行通信并允许容器相互通信。所以基本上你用-p 8080:8080做的事情就是将Docker的内部网络连接到&#34;外部&#34;网络 - 即。主机的网络适配器 - 在特定端口上。

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

您需要的是两件事之一:

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

  2. 使用上述bridged网络模式将VirtualBox VM直接连接到本地网络。

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

    这就是所有更高级别的解释 - 现在您需要弄清楚如何更改VirtualBox VM的配置。在这里,我可以帮助您 - 我不知道您在Windows机器上使用什么工具来完成所有这些并且我根本不熟悉在Windows上使用Docker。

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

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

答案 2 :(得分:4)

尝试了几件事后,这对我有用:

  • 使用--publish = 0.0.0.0:8080:8080 docker flag
  • 将虚拟盒网络模式设置为NAT,不使用任何端口转发

使用0.0.0.0以外的地址,我没有成功。

答案 3 :(得分:1)

这是Windows用户运行Docker容器时面临的最常见问题。 IMO这是“关于Docker的百万美元问题”; @“ Rocco Smit”正确指出“入站流量,因为默认情况下,它是在我的主机的防火墙上被禁用的”;就我而言,是我的McAfee Anti Virus软件。我在McAfee的“防火墙设置”中添加了其他端口,以允许来自同一Wifi LAN上其他计算机的入站流量;那是魔术。我花了一个多星期的时间浏览整个Internet,SO,Docker文档,与Docker Networking相关的教程后的教程,以及“ macvlan”,“ ipvlan”,“ user”的“ Windows上不支持”的许多插图定义的网桥”,甚至是同一条SO线程两次。我什至开始与“有人在生产中使用Docker吗?”浏览谷歌,(是的,我知道Linux在Prod工作负载中比Windows服务器更受欢迎),因为我无法从同一家庭wifi中的移动设备访问nginx。应用程序已部署在Windows的Docker容器中。毕竟,如果您至少不能从同一LAN中的其他计算机/设备访问应用程序(部署在Docker容器上),那有什么用?最终以我为例,问题仅在于防火墙阻止入站流量;

答案 4 :(得分:1)

TLDR::如果启用了Windows防火墙,请确保专用网络上的“ vpnkit”存在例外。

对于我的特殊情况,当我尝试从本地网络上的另一台计算机访问容器的已发布端口时,我发现Windows防火墙正在阻止我的连接,因为禁用它可以使一切正常工作。

但是,我不想完全禁用防火墙,只是为了访问容器的服务。这就提出了一个问题,即哪个“ app”代表我的容器的服务在监听。找到another SO thread并教我如何使用netstat -a -b发现机器上侦听套接字后面的应用程序后,我知道它是vpnkit.exe,在Windows防火墙设置中已经有一个条目:但是“专用网络”已被禁用,启用它后,我便可以从另一台计算机访问容器的服务,而不必完全禁用防火墙。

答案 5 :(得分:0)

我发现,与设置-p端口值一起,用于Windows的Docker使用vpnkit,并且默认情况下,在我的主机的防火墙上禁用了vpnkit的入站流量。在为vpnkit启用入站TCP规则后,我可以从本地网络上的其他计算机访问我的容器。

答案 6 :(得分:0)

我无法相信您无法从主机外部建立与Docker容器的连接。我已经使用Docker一年多了,并且已经在Linux上建立了系统。这是我第一次使用Docker for Windows,这让我感到震惊,因为很难在主机上创建套接字。

这个问题是否有解决方案,或者我真的需要在具有桥接适配器的VM内运行docker吗?

答案 7 :(得分:0)

我尝试了很多东西,但没有任何效果,最后我使用我机器的 IP 地址访问了 docker 主机 按照步骤

  1. 打开 CMD
  2. IPCONFIG /ALL
  3. 查找 IPV4 地址,在我这里是 192.168.1.7
  4. 然后我使用映射端口访问了托管在 docker 容器中的应用
  5. 就我而言,我尝试访问作为容器托管的 Jenkins 应用程序
  6. 很简单,192.168.1.7:50000
  7. 以同样的方式,我可以访问所有使用 docker 托管的容器应用
相关问题