0

我有一个设置是:

PC > Fedora(Hyper-V VM) > 运行 Web 应用程序的容器

我面临的问题是我无法从我的 PC 连接到 Web 应用程序(PC > Container Web 应用程序)

当服务启动时,它显示它正在监听http://0.0.0.0:8000

[2021-05-27 22:29:57 +0000] [23] [INFO] Starting gunicorn 20.1.0
[2021-05-27 22:29:57 +0000] [23] [INFO] Listening at: http://0.0.0.0:8000 (23)
[2021-05-27 22:29:57 +0000] [23] [INFO] Using worker: sync
[2021-05-27 22:29:57 +0000] [25] [INFO] Booting worker with pid: 25
[2021-05-27 22:29:57 +0000] [26] [INFO] Booting worker with pid: 26
[2021-05-27 22:29:57 +0000] [27] [INFO] Booting worker with pid: 27

尝试连接到http://0.0.0.0:8000不起作用,而是使用容器 IP:8000 连接,例如:172.17.0.2:8000

在我的 VM 上执行此操作很好,我可以连接并使用该应用程序,但它在我的 PC 上不起作用。我也尝试使用 VM ip、0.0.0.0 和容器 IP 进行连接,就像在 VM 中一样。但是这些选项都不起作用。

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

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

4

2 回答 2

0

这里有几个层,每个层都有自己的一组 IP 地址。

+------------------------+
| Host +---------------+ |
|      | VM +--------+ | |
|      |    | Docker | | |
|      |    +--------+ | |
|      +---------------+ |
+------------------------+

重要的细节是每一层只能看到更远的一层。如果你在网络上另一台机器的堆栈之外,你不能直接访问虚拟机的 IP 地址;如果您在主机上,则无法访问容器专用 IP 地址。

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

例如,假设您在 VM 内启动容器,并带有一个-p 12345:80选项。如果您从主机连接到端口 12345 上的虚拟机 IP 地址,则会转发到容器中的端口 80。

vm$ docker run -d -p 12345:80 my-image
host$ curl http://vm:12345
+---------------------------------------------------+
| Host                +---------------------------+ |
|                     | VM          +-----------+ | |
|                     |             | Docker    | | |
|                     |             |           | | |
|                     | docker run  | ./app     | | |
| http://vm:12345 --> | -p 12345:80 | -addr :80 | | |
|                     |             +-----------+ | |
|                     +---------------------------+ |
+---------------------------------------------------+

Docker Desktop 中使用了相同的设置,尽管 VM 相当隐藏,但这就是容器专用 IP 地址在 MacOS 或 Windows 主机上不起作用的原因。同样,如果没有本机 Linux 主机上的 VM,您将无法从其他主机访问容器专用 IP。

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

于 2021-05-28T11:23:43.970 回答
0

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

参考:https ://superuser.com/a/227508/282690

Host-only only permits network operations with the Host OS.

NAT mode will mask all network activity as if it came from your Host OS, although the VM can access external resources.

Bridged mode replicates another node on the physical network and your VM will receive it's own IP address if DHCP is enabled in the network.

因此,如果您将 VM 设置为桥接模式,它将获得自己的 IP 地址,与您的主机 PC 在同一网络中。

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

如果您使用主机模式,则需要重定向/转发端口。使用 Vagrant 作为示例:

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
于 2021-05-27T23:16:36.597 回答