【发布时间】: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,端口就无法访问。
标签: java linux curl docker spring-boot