无法从主机访问Docker端口

Tre*_*red 5 java linux curl docker spring-boot

我有一个新的Spring Boot应用程序,我刚刚完成并尝试将其部署到Docker.在容器内部,应用程序正常工作.它使用端口9000进行面向用户的请求,使用9100进行健康检查等管理任务.当我启动docker实例并尝试访问端口9000时,我收到以下错误:

curl: (56) Recv failure: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

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

docker run -P=true my-app
docker run -p 9000:9000 my-app
Run Code Online (Sandbox Code Playgroud)

解决方法

这一点的唯一方法工作是使用--net主机选项,但是这并不让我在该主机上运行多个集装箱.

docker run -d --net=host my-app
Run Code Online (Sandbox Code Playgroud)

端口和暴露实验

我使用了各种版本的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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

从容器

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
Run Code Online (Sandbox Code Playgroud)

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

这个问题看起来很相似,但很少有细节,也没有答案,所以我想我会尝试更多地记录我的情景.

Sam*_*Sam 10

我遇到了类似的问题,其中将主机IP地址指定为"127.0.0.1"将无法正确地将端口转发到主机.

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

例如-我节点应用程序-以下工作

app.listen(3000, '127.0.0.1')
Run Code Online (Sandbox Code Playgroud)

凡为以下工作:

app.listen(3000, '0.0.0.0')
Run Code Online (Sandbox Code Playgroud)

我猜这意味着默认情况下,docker正在公开0.0.0.0:containerPort - >本地端口

  • 这对我来说也是个问题.Hugo默认绑定到127.0.0.1,而docker使用0.0.0.0:ports.谢谢! (2认同)

And*_*ndy 3

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