Docker 如何从虚拟机外部连接到虚拟机容器内的web应用程序?

Docker 如何从虚拟机外部连接到虚拟机容器内的web应用程序?,docker,connection,virtual-machine,firewall,doccano,Docker,Connection,Virtual Machine,Firewall,Doccano,我有一个设置是: PC>Fedora(Hyper-V虚拟机)>运行web应用程序的容器 我面临的问题是无法从PC连接到web应用(PC>容器web应用) 当服务启动时,它表明它正在侦听 尝试连接不起作用,相反,我使用容器IP:8000进行连接 e、 g:172.17.0.2:8000 在我的虚拟机上这样做很好,我可以连接并使用该应用程序,但在我的PC上不起作用。我尝试使用虚拟机ip、0.0.0.0和容器ip进行连接,就像在虚拟机中一样。但这些选项都不起作用 我尝试使用iptables转发端口,但

我有一个设置是:

PC>Fedora(Hyper-V虚拟机)>运行web应用程序的容器

我面临的问题是无法从PC连接到web应用(PC>容器web应用)

当服务启动时,它表明它正在侦听

尝试连接不起作用,相反,我使用容器IP:8000进行连接 e、 g:172.17.0.2:8000

在我的虚拟机上这样做很好,我可以连接并使用该应用程序,但在我的PC上不起作用。我尝试使用虚拟机ip、0.0.0.0和容器ip进行连接,就像在虚拟机中一样。但这些选项都不起作用

我尝试使用iptables转发端口,但我不知道如何准确地使用它。我试着在谷歌上搜索一些命令并使用它们,但没有找到解决方案

有什么帮助吗?
也许这与我没有看到的另一件事有关

设置VM、主机、NAT或网桥有几种方法

参考:

所以,如果您将虚拟机设置为网桥模式,它将在与主机PC相同的网络中获得自己的IP地址

通过这种方式,您可以连接它们之间的任何端口,无需额外设置

如果使用主机模式,则需要重定向/转发端口。以流浪汉为样本:

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
  # ... for more ports if need
  # ... for more ports if need
end

这里有几个层,每个层都有自己的IP地址集

+------------------------+
| Host +---------------+ |
|      | VM +--------+ | |
|      |    | Docker | | |
|      |    +--------+ | |
|      +---------------+ |
+------------------------+
重要的细节是,每一层只能看到更远处的一层。如果您在网络上的另一台机器上,位于该堆栈之外,则无法直接访问VM的IP地址;如果您在主机上,则无法访问容器专用IP地址

+------------------------+
| Host +---------------+ |
|      | VM +--------+ | |
|      |    | Docker | | |
|      |    +--------+ | |
|      +---------------+ |
+------------------------+
但是,如果使用
docker run-p
选项或Compose
ports:
选项,则会导致运行docker守护程序的层打开一个转发到容器的网络侦听器。在此设置中,由于Docker作为VM运行,
Docker run-p
将端口从VM转发到容器

例如,假设您使用
-p 12345:80
选项在VM内部启动容器。如果从主机连接到端口12345上的VM的IP地址,该地址将转发到容器中的端口80

vm$docker run-d-p 12345:80我的图像
主机$curlhttp://vm:12345
Docker Desktop中也使用了相同的设置,尽管虚拟机相当隐蔽,但这就是为什么容器专用IP地址在MacOS或Windows主机上不起作用的原因。类似地,如果本机Linux主机上没有VM,则无法从其他主机访问容器专用IP


由于您始终可以使用从外部Docker发布的端口或从内部Docker使用容器网络访问容器,因此您永远不需要使用
Docker inspect
来查找容器的IP地址。

如何启动容器?您应该能够通过
docker run-p
或Compose
ports:
选项中的第一个端口号访问VM的IP地址。我以这种方式启动:docker run-d——name doccano-p 8000——it 1BF8684290D(在评论中,您说,
docker-run-p8000
只有一个端口号。在这种情况下,docker选择外部端口,您需要
docker-ports-doccano
来查找它。通常自己选择外部端口更容易。)这一解释对于理解我的网络发生了什么非常有帮助。事实上,我在防火墙中做了一个错误配置,导致连接问题,并在docker运行时仅使用一个端口号设置-p,导致容器选择了一个我不想要的端口,然后当我尝试通过0.0.0.0:8000连接时,它现在选择了因为端口错误而工作。我不知道docker会选择一个外部端口,如果只使用一个数字设置-p。谢谢,它帮助解决了我的问题
+------------------------+
| Host +---------------+ |
|      | VM +--------+ | |
|      |    | Docker | | |
|      |    +--------+ | |
|      +---------------+ |
+------------------------+
+---------------------------------------------------+
| Host                +---------------------------+ |
|                     | VM          +-----------+ | |
|                     |             | Docker    | | |
|                     |             |           | | |
|                     | docker run  | ./app     | | |
| http://vm:12345 --> | -p 12345:80 | -addr :80 | | |
|                     |             +-----------+ | |
|                     +---------------------------+ |
+---------------------------------------------------+