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

slmsl1lt  于 2022-11-03  发布在  Docker
关注(0)|答案(8)|浏览(237)

我已经创建了我的第一个docker容器,它运行一个服务器,使用Go语言,但是我不能从主机之外访问它。我刚刚开始使用docker,所以我在这里有点迷路。
所以我有一个非常简单的Go语言代码来启动一个服务器,我已经构建了一个docker映像,它安装Go语言并在Linux基础映像中构建代码。我在端口8080上运行服务器,所以我将该端口暴露给运行容器的主机,如下所示:

docker run -p 8080:8080 dockertest

这是可行的,我可以通过Docker的机器IP访问服务器(启动时出现在 *Docker快速入门终端 * 上的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转发或其他什么有关,但我在网络方面是一个完全的菜鸟,我主要是一个网页开发人员,几乎没有原生的经验。

kb5ga3dv

kb5ga3dv1#

1.打开Oracle VM虚拟机管理器
1.选择Docker使用的虚拟机
1.点击设置-〉网络
1.界面卡1应该(预设?)“连接至:网络地址转换”
1.单击高级-〉端口转发
1.添加规则:协议TCP、主机端口8080、访客端口8080(将主机IP和访客IP留空)

  1. Guest是您的Docker容器,Host是您的计算机
    现在您应该能够通过localhost:8080和your-internal-ip:8080浏览到您的容器。
xj3cbfub

xj3cbfub2#

TL;DR检查VirtualBox主机的网络模式-如果您希望虚拟机(及其托管的Docker容器)可在本地网络上访问,则应为bridged

听起来你的困惑在于要通过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端口,任何试图访问8080端口的IP地址为W的人都会被连接到。
这里的情况变得更加复杂:
VirtualBox,当它设置虚拟机时(VM),可以在几种不同的模式中配置网络。我不记得所有不同的选项都是什么,但你想要的是bridged。在这种模式下,VirtualBox将虚拟机连接到你的本地网络,就像它是网络上的一台独立机器一样,就像任何其他插入网络的计算机一样。在bridged模式下,虚拟机会像任何其他计算机一样出现在您的网络上。其他模式的设置方式不同,虚拟机在您的网络上不可见。
因此,假设您为Linux主机(bridged)正确设置了网络,则Linux主机将在您的本地网络上拥有一个IP地址(类似于192.168.0.x),并且您将能够在http://L:8080/访问您的Docker容器。
如果Linux主机设置为bridged以外的模式,您 * 可能 * 能够从Windows主机进行访问,但这将取决于它所处的模式。

EDIT-根据下面的评论,我上面描述的情况听起来很像是正确的。

让我们回顾一下:以下是Docker在我的计算机(Ubuntu Linux)上的工作方式。
假设我运行与您相同的命令:docker run -p 8080:8080 dockertest。它的作用是基于dockertest映像启动一个新容器,并向前(连接)Linux主机上的端口8080(我的PC)连接到容器上的端口8080。Docker建立自己的内部网络(具有自己的一组IP地址),以允许Docker守护程序进行通信,并允许容器彼此进行通信。我们用-p 8080:8080做的是在一个特定的端口上将Docker的内部网络与“外部”网络(即主机的网络适配器)连接起来。
到目前为止,您是否了解我的意思?好的,现在让我们后退一步,看看您的系统。您的计算机运行的是Windows - Docker没有(当前)运行在Windows上,因此您使用的工具已经在VirtualBox虚拟机中设置了一个Linux主机。完全相同的事情正在发生-Linux主机上的端口8080连接到容器上的端口8080.这里最大的区别是您的Windows主机不是运行容器的Linux主机,这里还有另一层,您在这一层的通信中遇到了问题。
您需要的是以下两种情况之一:
1.将VirtualBox虚拟机上的端口8080连接到Windows主机上的端口8080,就像将Docker容器连接到主机端口一样。
1.使用上面描述的bridged网络模式将VirtualBox VM直接连接到本地网络。
如果选择第一个选项,您将能够访问位于http://W:8080的容器,其中W是Windows主机的IP地址或主机名。如果选择第二个选项,您将能够访问位于http://L:8080的容器,其中L是Linux VM的IP地址或主机名。
以上就是更高层次的解释-现在您需要弄清楚如何更改VirtualBox虚拟机的配置。这是我无法真正帮助您的地方-我不知道您在Windows计算机上使用什么工具来完成这一切,而且我对在Windows上使用Docker一点也不熟悉。
如果你能进入VirtualBox配置窗口,你可以进行下面描述的更改。还有一个命令行客户端可以修改虚拟机,但我对它不熟悉。
对于bridged模式(这确实是最简单的选择),关闭VM,单击顶部的“Settings”按钮,将网络模式更改为bridged,然后重新启动VM,就可以开始了。VM应该通过DHCP获取本地网络上的一个IP地址,并且应该对网络上该IP地址的其他计算机可见。

dpiehjr4

dpiehjr43#

在尝试了几种方法后,这对我很有效:

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

对于0.0.0.0以外的地址,我没有成功。

m0rkklqb

m0rkklqb4#

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

对于我的特定情况,当我尝试从本地网络上的另一台计算机访问容器的发布端口时,我发现Windows防火墙正在阻止我的连接,因为禁用它可以使一切正常工作。
然而,我不想完全禁用防火墙,这样我就可以访问我的容器服务了。这就引出了一个问题,即哪个“应用程序”正在代表我的容器服务进行侦听。在找到another SO thread后,我知道它教我使用netstat -a -b来发现我的机器上侦听套接字后面的应用程序,在我的Windows防火墙设置中已经有一个条目:但“专用网络”在其上被禁用,一旦启用它,我就能够从另一台计算机访问我的容器的服务,而不必完全禁用防火墙。

ssm49v7z

ssm49v7z5#

这是Windows用户在运行Docker容器时面临的最常见的问题。IMO这是“Docker上的百万美元问题”;@“Rocco Smit”已经正确地指出“它的入站流量在我的主机的防火墙上被默认禁用”;在我的例子中,我的McAfee防病毒软件。我在McAfee的防火墙设置中添加了额外的端口,以允许来自同一Wifi局域网上其他计算机的入站流量;然后它就变得神奇了。我挣扎了一个多星期浏览了整个互联网,所以,Docker文档,一个又一个与Docker网络相关的教程,以及许多“在Windows上不支持”的“MacVLAN”,“IPVLAN”,“用户定义的桥”的插图,甚至几次使用同样的SO线程。我甚至开始浏览谷歌与“任何人在生产中使用Docker吗?",(是的,我知道Linux比Windows服务器更受Prod工作负载的欢迎),因为我不能访问(从我的移动的在同一个家庭wifi)一个nginx应用程序部署在Docker容器在Windows上。毕竟,它是什么好,如果你不能访问应用程序(部署在Docker容器)从其他计算机/设备在同一个局域网至少;最终在我的情况下,问题只是与防火墙阻止入站流量;

piwo6bdm

piwo6bdm6#

我已经尝试了很多东西,但没有工作,然后最后我访问了Docker主机使用我的机器的IP地址按照步骤
1.打开CMD

  1. IPCONFIG /全部
    1.查找IPV4地址,在我的示例中为192.168.1.7
    1.然后,我使用Map端口访问了托管在Docker容器中的应用程序
    1.在我的例子中,我尝试访问作为容器托管的Jenkins应用程序
    1.简单地说,它的工作192.168.1.7:50000
    1.以同样的方式,我可以访问所有使用Docker托管的容器应用程序
sg3maiej

sg3maiej7#

我发现,沿着设置-p端口值,Docker for Windows使用vpnkit,它的入站流量在我的主机的防火墙上默认被禁用。在启用vpnkit的入站TCP规则后,我能够从本地网络上的其他机器访问我的容器。

umuewwlo

umuewwlo8#

基于Kryten的答案-我将添加一些关于Windows中配置的信息。
1.停止虚拟机
1.打开虚拟机设置-〉网络-〉“适配器3”选项卡:

  • 选中“启用网卡”
  • 附于:“桥接适配器”。
  • 名称:[您的Windows网络适配器]

相关问题