【问题标题】:How to communicate with a running Docker container in a Host X from another Host Y(not from a container in Host Y)如何与来自另一个主机 Y 的主机 X 中正在运行的 Docker 容器通信(而不是来自主机 Y 中的容器)
【发布时间】:2020-08-27 14:56:29
【问题描述】:

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

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

我在主机 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”,但无法访问容器。

【问题讨论】:

  • 如果您尝试通过容器 ip 从容器网络外部与容器通信,则很可能您做错了什么。您尝试做的预期解决方案是将容器端口发布到主机端口。有关已发布端口的更多详细信息,请参阅docs.docker.com/config/containers/container-networking/…

标签: docker docker-compose docker-swarm docker-machine


【解决方案1】:

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

如果您不考虑 Docker,并直接在主机上运行进程,这应该很简单:从主机 Y,您可以根据其 DNS 名称和服务器运行的端口调用主机 X 上的进程.

hostY$ curl http://hostX:12345/

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

hostX$ docker run -p 12345:12345 imagename

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

在正常情况下,您不需要考虑 Docker 内部的 IP 地址;你不需要像你展示的那样手动的ip route-setup 命令,你不应该docker inspectdocker run --ip 来查找或设置这个细节。

【讨论】:

  • 感谢@David Maze 的详细解释,我对这个 docker-networking 有了很好的了解。
【解决方案2】:

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

你会跑:

docker run --detach -p 8080:80 nginx

然后你可以使用http://60.0.0.28:8080访问你的nginx实例。

【讨论】:

  • 感谢 Kanrad,它有助于从外部主机与容器进行通信。但我想知道的是我们是否可以直接与来自其他主机的容器 IP 进行通信,或者这种情况是不可能的???
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多