当前位置: 首页 > 面试题库 >

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

胡元明
2023-03-14
问题内容

我创建了我的第一个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容器)。

听起来您的困惑在于连接到哪个主机以便通过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,并且任何尝试访问IP地址上的端口8080的人都W将建立连接。

这就是它变得更加复杂的地方:

VirtualBox设置虚拟机(VM)时,可以以几种不同模式之一配置网络。我不记得所有不同的选项是什么,但是您想要的是bridged。在这种模式下,VirtualBox会将虚拟机连接到本地网络,就像虚拟机是网络上的独立计算机一样,就像插入网络中的任何其他计算机一样。在bridged模式下,虚拟机会像其他任何计算机一样出现在您的网络上。其他模式设置的方式有所不同,并且计算机将在您的网络上不可见。

因此,假设您为Linux主机(bridged)正确设置了网络连接,则Linux主机将在您的本地网络上具有IP地址(如192.168.0.x之类),并且您可以在处访问Docker容器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.

到目前为止和我在一起?好的,现在让我们退后一步,看看您的系统。您的计算机正在运行Windows-
Docker(当前)不在Windows上运行,因此您使用的工具已在VirtualBox虚拟机中设置了Linux主机。当你做docker run你的环境,同样的事情发生了-
8080端口在Linux主机上连接到端口8080的容器上。这里最大的区别是您的Windows主机不是运行容器的Linux主机,因此这里有另一层,并且跨该层的通信会遇到问题。

您需要做的是以下两件事之一:

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

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

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

这就是所有更高层次的说明-现在您需要弄清楚如何更改VirtualBox VM的配置。这是我无法真正为您提供帮助的地方-
我不知道您在Windows机器上使用什么工具来完成所有这些工作,而且我对在Windows上使用Docker一点都不熟悉。

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

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



 类似资料:
  • 在Ubuntu 20.04上运行新的Docker 20.10.1。此版本包括对主机的支持。码头工人。Linux上dockerd中的内部 我在使用SSL证书的容器中运行了一系列服务,我想使用Telegraf(稍后发送到Grafana仪表板)检查证书是否过期。 所有带有网络接口和Telegraf的服务都运行在同一个Docker主机上。所有服务都在自己的网桥网络中。我想在端口9000上从Telegraf

  • 问题内容: 所以我想连接到我在主机上运行的mongodb(DO Drop,Ubuntu 16.04)。它在localhost 的默认端口上运行。 然后,我使用mup将我的Meteor应用程序部署在我的DO Drop上,该DO Drop使用docker在容器内运行Meteor应用程序。到目前为止,一切都很好。使用标准连接URL将应用程序连接到mongodb。现在我有以下问题: 显然不能在docker

  • 问题内容: 所以我有一个Nginx在docker容器中运行,我有一个mysql在本地主机上运行,​​我想从我的Nginx内部连接到MySql。MySql在localhost上运行,并且没有将端口暴露给外界,因此它绑定在localhost上,而不绑定在计算机的IP地址上。 有什么方法可以从此Docker容器中连接到此MySql或localhost上的任何其他程序吗? 此问题与“如何从Docker容器

  • 问题内容: Docker容器可以通过哪个IP地址连接到Windows版Docker(在Windows 10上)上的主机?您如何找到此IP地址? 例如:您有一个服务在Windows 10计算机上的端口1234上运行。容器中的程序必须访问此服务。程序应使用哪个IP地址连接到主机? 问题答案: 简短的回答 :在大多数情况下,您需要 10.0.75.1 。 在适用于Windows的Docker中,容器通过

  • docker容器可以在哪个IP地址上连接到它在docker for Windows(在Windows 10上)上的主机?如何找到这个IP地址?

  • 问题内容: 我正在运行一个docker mysql映像,以下是docker-compose.yml文件的外观: 这很好。 我的问题是:如何从主机(我的Macbook)上的命令行mysql客户端连接到在该容器上运行的MySQL实例? 澄清: 我有一台装有Docker的Macbook 我有一个带有mysql的docker容器 我想从Macbook的终端连接到上述容器上运行的mysql实例 我不想使用命