无法通过容器的 ip 和通过 http 暴露的端口访问 Docker 容器中的 Web 应用程序

Posted

技术标签:

【中文标题】无法通过容器的 ip 和通过 http 暴露的端口访问 Docker 容器中的 Web 应用程序【英文标题】:Unable to access web application in Docker container via container's ip and exposed port over http 【发布时间】:2016-10-09 18:25:40 【问题描述】:

我有一个在 Centos 主机上运行的 docker 容器,并且有一个主机端口:容器端口映射。 docker 容器正在运行一个 Web 应用程序。

CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                            NAMES
a2f8ce62bb69        image1                 "/bin/bash"         16 hours ago        Up 16 hours         22/tcp, 0.0.0.0:7001->7001/tcp   nostalgic_elion

我可以通过映射的主机 IP 地址和主机端口通过 http 访问应用程序。但是,如果我将主机 IP 替换为容器 IP,则会收到一条错误消息,提示“无法访问站点”ERR_CONNECTION_TIMED_OUT。

是否可以使用容器 IP 和通过 http 公开的端口进行访问?不幸的是,我没有太多的网络背景。

【问题讨论】:

如果您访问您的主机 IP:7001,它会将您重定向到您的容器 IP:7001。您只能从您的 centos 主机内部访问容器 IP(内部 ip)。 curl 容器-ip:7001 它没有重定向到容器 IP。问题不在于访问容器中运行的应用程序。但我想使用容器的 IP 访问应用程序。这不可能吗? 容器的 IP (172...) 是一个无法从外部访问的 IP。因此,如果您有一个带有浏览器的 centos 用户界面,则可以访问它:172.xx:7001。但是,当您使用没有 UI 的真实服务器时,您必须使用服务器的公共 ip:7001 才能从不在您的 centos 服务器内的浏览器访问您的应用程序 【参考方案1】:

默认情况下,Docker 容器可以与外界建立连接,但外界无法连接到容器。 (https://docs.docker.com/v1.7/articles/networking/)

但是,文档说,外部世界可以通过一些额外的运行选项与容器对话。文档说使用带有选项 -P 或 ----publish-all=true|false 的运行。请参阅同一 docker networking 页面中的选项。

【讨论】:

我已经看过文档,因此使用 -p host_port:container_port 运行容器。我的问题更多是关于容器的 IP 地址。 lorenzvth7 正确地提到容器的 IP 地址从外部可见。关于如何使其可见的任何想法?正如我提到的,我没有太多的网络背景。 当您能够使用 ip-of-your-host:port(或内部私有 ip:port)访问和配置所有内容时,为什么要这样做。 每个 docker 容器运行一组应用程序。现在,当端点与其他团队共享时,会出现相同主机名的混淆。由于每个容器都分配了单独的IP地址,因此我想使用IP地址从外部访问应用程序 这里有更详细的解释***.com/questions/25036895/…,您可以在主机上使用 IP 别名并在 -p 选项中添加 ip binding -p ip-alias:port:container-Port 来解决它跨度> 【参考方案2】:

如果您只需要与团队共享不同的 IP 地址。使用 docker 容器 ip 地址更新您的主机文件 - localhost

My /etc/hosts file:

container-ip   localhost
container-ip   localhost
container-ip   localhost

【讨论】:

以上是关于无法通过容器的 ip 和通过 http 暴露的端口访问 Docker 容器中的 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器内网通过独立IP直接访问的方法

如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?

kubernetes 暴露服务端口的几种方式

Dockerizing React App:应用程序在容器内启动,但无法从暴露的端口访问

无法通过 Google Cloud VM 的外部 IP 访问 nginx 容器

运行 apache 的 Docker 容器总是暴露端口 80