如何从另一个主机 Y(而不是主机 Y 中的容器)与主机 X 中的 运行 Docker 容器通信

How to communicate with a running Docker container in a Host X from another Host Y(not from a container in Host Y)

我正在试验 Docker-网络,我设置了如下场景,

已安装 docker 通过网络连接的主机 X(主机 X IP:60.0.0.28)和 运行 ubuntu 的基本 docker 容器-OS(Docker 容器仅连接到默认 docker 桥接网络,即 172.17.0.0/16 和 172.17.0.2 是容器 IP)。现在尝试从同一网络(主机 Y IP:60.0.0.40)中未安装 docker 的另一个主机 Y 与 运行ning 容器进行通信。

我在 host-Y 中添加了基本路由,例如“ip route add 172.17.0.0/16 via 60.0.0.28 dev ens3”。

从容器我能够 ping 主机 Y & 在相反的情况下,我只能从主机 Y ping docker 网关“172.17.0.1”但无法到达容器。

假设您想在主机 X 上启动 Dockerized nginx。

你会 运行:

docker run --detach -p 8080:80 nginx

然后您可以使用 http://60.0.0.28:8080.

访问您的 nginx 实例

在很多情况下 Docker-internal IP 地址都没有用;来自不同主机的呼叫就是其中之一。您应该完全忽略这些作为实现细节。

如果你把 Docker 去掉,运行 进程直接在主机上,这应该很简单:从主机 Y,你可以调用主机 X 上的进程给它服务器 运行 正在使用的 DNS 名称和端口。

hostY$ curl http://hostX:12345/

如果该进程实际上 运行 正在 Docker 容器中,您需要确保已使用已发布的端口启动容器。这不一定需要匹配进程正在侦听的端口。

hostX$ docker run -p 12345:12345 imagename

完成此操作后,可以通过主机的 DNS 名称或 IP 地址以及发布的端口访问该进程,与使用 non-container 服务器的方式相同。

在正常情况下,您不需要考虑 Docker-internal 个 IP 地址;您不需要像您显示的那样手动 ip route-setup 命令,并且您不应该 docker inspectdocker run --ip 来查找或设置此详细信息。