如何从主机外部(同一networking)连接到docker集装箱
我创build了我的第一个docker集装箱,它使用Go运行服务器,但无法从主机外部访问它。 我刚刚开始与docker工人,所以我有点迷路了。
因此,我有一个非常简单的启动服务器的Go代码,我已经构build了Docker镜像,它安装了Go并在Linux基础镜像中构build了代码。 我正在端口8080上运行服务器,所以我暴露该端口运行容器的主机是这样的:
docker run -p 8080:8080 dockertest
这工作, 我得到通过docker的机器IP ( 启动时出现在Docker快速启动terminal上的IP)访问服务器 ,问题是我无法访问我从主机外部托pipe的网站,所以如果我尝试在我的手机上打开相同的IP地址,只是给我一个错误:此网页不可用(ERR_CONNECTION_TIMED_OUT)。
我也试着指定这样的IP:
docker run -p 192.168.0.157:8080:8080 dockertest
但是当我这样做,我不能通过泊坞窗机器的IP,也不是在上面的命令行上指定的IP访问网站。 我也不确定哪个IP我想写在该命令我用我的电脑的IP,我也尝试127.0.0.1(本地主机),但是这给了我相同的结果:不能访问通过任何网站IP什么。
我GOOGLE了这个问题,发现了很多stackoverflow的问题,但都没有帮助我解决了我的问题,其中大部分面向Linux或Mac,所以解决scheme并不适用于我的情况。
另外,我可以在计算机上运行Go代码,并通过计算机的IP从同一networking中的其他设备访问网站。 我不明白为什么我在Docker机器上运行它时无法访问它,这让我想到它可能与IP转发有关,但是我在networking上是一个完整的noob,主要是networking开发人员,几乎没有本地经验。
TL; DR检查VirtualBox主机的networking模式 – 如果您希望虚拟机(及其托pipe的Docker容器)在本地networking上可访问,则应将其bridged
。
这听起来像你的混淆在哪个主机连接到通过HTTP访问您的应用程序。 你还没有真正明白你的configuration是什么 – 我要做一些猜测,基于你的标签中有“Windows”和“VirtualBox”的事实。
我猜你已经在运行在Windows主机上的VirtualBox中运行了一些Linux的Docker。 我要标记的IP地址如下:
D
= Docker容器的IP地址
L
=在VirtualBox中运行的Linux主机的IP地址
W
= Windows主机的IP地址
在Windows主机上运行Go应用程序时,可以从本地networking上的任何位置使用http://W:8080/
进行连接。 这是有效的,因为Go应用程序绑定Windows机器上的端口8080,任何试图访问端口8080的IP地址为W
都将连接。
而这里变得更加复杂:
当VirtualBox设置虚拟机(VM)时,可以使用几种不同的模式之一来configurationnetworking。 我不记得所有不同的选项,但你想要的是bridged
。 在这种模式下,VirtualBox将虚拟机连接到本地networking,就好像它是networking上的独立机器一样,就像连接到networking的其他机器一样。 在bridged
模式下,虚拟机像任何其他机器一样出现在networking上。 其他模式设置不同,机器将不会在您的networking上可见。
因此,假设您为Linux主机( bridged
)正确设置了networking,Linux主机将在您的本地networking上拥有一个IP地址(类似于192.168.0.x),您将能够通过http://L:8080/
。
如果Linux主机被设置为bridged
以外的某种模式,则可以从Windows主机访问,但这取决于它所处的模式。
编辑 – 基于下面的评论,这听起来非常像我上面描述的情况是正确的。
让我们稍微回顾一下:Docker是如何在我的电脑上工作的(Ubuntu Linux)。
想象一下,我运行相同的命令: docker run -p 8080:8080 dockertest
。 这样做是基于dockertest
映像启动一个新的容器,并在Linux主机(我的PC)上将端口8080转发(连接)到容器上的端口8080。 Docker设置了自己的内部networking(拥有自己的一组IP地址),允许Docker守护进程进行通信,并允许容器相互通信。 所以,基本上你在做什么 – -p 8080:8080
正在连接Docker的内部networking与“外部”networking – 即。 主机的networking适配器 – 在特定的端口上。
跟我到目前为止? 好的,现在让我们退后一步,看看你的系统。 您的机器正在运行Windows – Docker目前不在Windows上运行,因此您正在使用的工具已经在VirtualBox虚拟机中设置了Linux主机。 在您的环境中执行docker run
时,会发生完全相同的事情 – Linux主机上的端口8080连接到容器上的端口8080。 这里最大的区别是你的Windows主机不是运行容器的Linux主机,所以这里还有另外一个层,它是通过这个层的通信,你遇到问题。
你需要的是以下两件事之一:
-
将VirtualBox VM上的端口8080连接到Windows主机上的端口8080,就像连接Docker容器到主机端口一样。
-
使用上述的
bridged
networking模式将VirtualBox VM直接连接到本地networking。
如果您select第一个选项,则可以通过http://W:8080
访问容器,其中W
是Windows主机的IP地址或主机名。 如果您select第二个,则可以通过http://L:8080
访问容器,其中L
是Linux VM的IP地址或主机名。
所以这就是更高级的解释 – 现在你需要弄清楚如何改变VirtualBox虚拟机的configuration。 这里是我无法真正帮助你的地方 – 我不知道你用什么工具在Windows机器上完成所有这些工作,而且我也不太熟悉在Windows上使用Docker。
如果您可以进入VirtualBoxconfiguration窗口,则可以进行如下所述的更改。 还有一个命令行客户端,将修改虚拟机,但我不熟悉这一点。
对于bridged
模式(这确实是最简单的select),closures虚拟机,单击顶部的“设置”button,将networking模式更改为bridged
,然后重新启动虚拟机,然后重启。 虚拟机应该通过DHCP在本地networking上获取IP地址,并且该IP地址上的其他计算机应该可见。
- 打开Oracle VM VirtualBox Manager
- selectDocker使用的虚拟机
- 点击设置 – >networking
- 适配器1应该(默认?)是“附加到:NAT”
- 点击高级 – >端口转发
- 添加规则:协议TCP,主机端口8080,访客端口8080(离开主机IP和来宾IP空)
- 客人是你的docker集装箱,主机是你的机器
你现在应该可以通过localhost:8080和your-internal-ip:8080浏览你的容器。
尝试了几件事情后,这对我有用:
- 使用–publish = 0.0.0.0:8080:8080泊坞窗标志
- 将virtualboxnetworking模式设置为NAT,并且不使用任何端口转发
除了0.0.0.0
以外的地址,我没有成功。