主机无法访问 Docker 端口

Posted

技术标签:

【中文标题】主机无法访问 Docker 端口【英文标题】:Docker port isn't accessible from host 【发布时间】:2015-01-12 07:20:39 【问题描述】:

我刚刚完成了一个新的 Spring Boot 应用程序,并正在尝试将其部署到 Docker。在容器内,应用程序运行良好。它使用端口 9000 处理面向用户的请求,使用端口 9100 处理运行状况检查等管理任务。当我启动一个 docker 实例并尝试访问端口 9000 时,我收到以下错误:

curl: (56) Recv failure: Connection reset by peer

经过大量实验(通过 curl),我通过几种不同的配置确认应用程序在容器内运行良好,但是当我尝试将端口映射到主机时,它无法连接。我尝试使用以下命令启动它。它们都不允许我从主机访问端口。

docker run -P=true my-app
docker run -p 9000:9000 my-app

解决方法

works 的唯一方法是使用--net host option,但这不允许我在该主机上运行多个容器。

docker run -d --net=host my-app

端口和暴露实验

我使用了各种版本的 Dockerfile,暴露了不同的端口,例如 9000 和 9100 或仅 9000。这些都没有帮助。这是我的最新版本:

FROM ubuntu
MAINTAINER redacted

RUN apt-get update
RUN apt-get install openjdk-7-jre-headless -y
RUN mkdir -p /opt/app

WORKDIR /opt/app

ADD ./target/oauth-authentication-1.0.0.jar /opt/app/service.jar
ADD config.properties /opt/app/config.properties

EXPOSE 9000
ENTRYPOINT java -Dext.properties.dir=/opt/app -jar /opt/app/service.jar

Hello World 有效

为了确保我可以运行 Spring Boot 应用程序,我尝试了Simplest-Spring-Boot-MVC-HelloWorld,它运行良好。

Netstat 结果

我使用 netstat 从主机和容器进行端口扫描:

来自主机

root@my-docker-host:~# nmap 172.17.0.71 -p9000-9200

Starting Nmap 6.40 ( http://nmap.org ) at 2014-11-14 19:19 UTC Nmap
scan report for my-docker-host (172.17.0.71)
Host is up (0.0000090s latency).
Not shown: 200 closed ports
PORT     STATE SERVICE
9100/tcp open  jetdirect
MAC Address: F2:1A:ED:F4:07:7A (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.48 seconds

来自容器

root@80cf20c0c1fa:/opt/app# nmap 127.0.0.1 -p9000-9200

Starting Nmap 6.40 ( http://nmap.org ) at 2014-11-14 19:20 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000070s latency).
Not shown: 199 closed ports
PORT     STATE SERVICE
9000/tcp open  cslistener
9100/tcp open  jetdirect

Nmap done: 1 IP address (1 host up) scanned in 2.25 seconds

容器正在使用 Ubuntu 我复制的主机是 Centos 和 Ubuntu。

This SO question 看起来很相似,但细节很少,也没有答案,所以我想我会尝试更多地记录我的场景。

【问题讨论】:

您展示的唯一“docker run”不做任何端口映射。您能否展示如何启动容器,例如docker run -d -p 9000:9000 my-app? 对不起。我已经添加了我尝试过的两个选项。没有工作。 :( 更新:我很确定这与 Docker 没有任何关系。我已经能够在 docker 之外重现这一点,并且我从 Spring Boot 中基于 Java 的应用程序中得到了奇怪的结果。在继续解决此问题时,我将提供更多更新。在这一点上我认为它与 Spring Boot 的 server.address 属性有关。 @TrevorAllred:我同意你的看法。一旦我在我的 Spring Boot 配置中添加 server.address,端口就无法访问。 【参考方案1】:

我遇到了类似的问题,将主机 IP 地址指定为“127.0.0.1”不会正确地将端口转发到主机。

将 Web 服务器的 IP 设置为“0.0.0.0”可以解决问题

例如 - 对于我的 Node 应用 - 以下不起作用工作

app.listen(3000, '127.0.0.1')

以下是否起作用:

app.listen(3000, '0.0.0.0')

我猜这意味着 docker 默认公开 0.0.0.0:containerPort -> 本地端口

【讨论】:

这也是我的问题。 Hugo 默认绑定到 127.0.0.1,而 docker 使用 0.0.0.0:ports。谢谢! 答案对我来说不是很清楚 - 所以我想向任何阅读它的人澄清 - 这是一个很好的答案,只需在您的 docker 容器中,您的应用程序应该侦听 IP 0.0.0.0 而不是在 127.0.0.1 这个答案也帮助我弄清楚为什么我的 socket.io java 服务器有类似的问题。对我来说,修复是设置Configuration config = new Configuration()config.setHostname("0.0.0.0")server = new Socketioserver(config)【参考方案2】:

您应该使用docker run -P 运行以使端口自动映射到要在 Dockerfile 中设置的相同值。请参阅http://docs.docker.com/reference/run/#expose-incoming-ports

【讨论】:

expose 行应该足以获取容器 172.17 地址上可用的端口; -P(或-p)仅在您希望它在主机的地址上可用时才需要。

以上是关于主机无法访问 Docker 端口的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker 容器中访问 MacOSX 主机上的端口

记一次docker springboot无法访问

无法从我的本地主机访问 docker 上的 apache

解决Windows10下无法对docker容器进行端口访问(端口映射的问题)

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

docker常见问题