主机无法访问 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 主机上的端口
解决Windows10下无法对docker容器进行端口访问(端口映射的问题)