【问题标题】:How to expose the docker container ip to the external network?如何将docker容器ip暴露给外网?
【发布时间】:2019-04-25 12:27:17
【问题描述】:

我想将容器 ip 暴露给主机运行的外部网络,以便我可以直接从外部机器 ping docker 容器 ip。 如果我从外部机器 ping docker 容器 ip,其中托管 docker 的机器和我从中 ping 的机器在同一个网络中,我需要从这些机器获得响应

【问题讨论】:

  • 每当有人提出这样的问题时,我的第一个问题是:您真的需要将容器ip暴露给外部网络吗?因为除了少数边缘情况外,几乎所有情况下,Docker 端口发布就足够了,而此类问题通常源于对端口发布工作原理的错误理解。

标签: docker networking kubernetes


【解决方案1】:

从另一台机器 ping 容器的 IP(即当您查看 docker inspect [CONTAINER] 时显示的 IP)不起作用。但是,容器可以通过其主机的公共 IP 访问。

除了 Borja 的回答之外,您还可以通过将 -p [HOST_PORT]:[CONTAINER_PORT] 添加到您的 docker run 命令来公开 Docker 容器的端口。

例如如果您想从另一台机器访问 Docker 容器中的 Web 服务器,可以使用docker run -d -p 80:80 httpd:alpine 启动它。然后可以通过主机的端口80 访问容器的端口80。同一网络上的其他机器也将能够访问此容器中的网络服务器(当然取决于防火墙设置等......)

【讨论】:

    【解决方案2】:

    既然你把它标记为

    您不能直接将数据包发送到单个 Docker 容器。您需要将它们发送到能够路由它们的其他地方。在普通 Docker 的情况下,您需要使用docker run -p 选项将端口发布到主机,然后容器将通过主机的 IP 地址或 DNS 名称通过发布的端口访问。在 Kubernetes 上下文中,您需要设置一个服务,该服务能够将流量路由到运行容器的 Pod(或多个 Pod),并最终通过该服务访问容器。

    容器内部 IP 地址在许多情况下基本上是无用的。 (它们根本无法从主机外访问;在某些环境中,您甚至无法从同一主机上的 Docker 外部访问它们。)您可以使用其他机制来访问容器(来自 Docker 外部的docker run -p, Docker 中的跨容器 DNS),您根本不需要查找这些 IP 地址。

    您的问题非常强调ping(1)。这是一个非常底层的调试工具,它使用称为 ICMP 的网络协议。如果使用 ICMP 发送数据包实际上是您工作流程的核心,那么您将很难在 Docker 或 Kubernetes 中运行它。我怀疑你实际上不是。不用太担心能够直接 ping 容器;如果您需要验证请求是否到达其容器,请使用 curl(1) 等高级工具。

    【讨论】:

      最近更新 更多