容器建立连接被拒绝

时间:2018-08-31 16:35:49

标签: docker port docker-container

我的Docker容器出现问题,其中一个是REST API服务器,另一个是用来卷曲前一个的测试容器。

我创建了一个具有特定IP地址范围的自定义docker网络,并且两个容器都已连接到该网络。

在Dockerfile(REST API服务器映像)中,我公开了端口8090,并在运行容器时使用-p标志将其映射到主机端口8090。我确实检查了REST容器是否通过netstat -a暴露了端口,但事实并非如此。我不确定是什么问题,因为我看不到自己在做错什么!

用于REST API服务器的Dockerfile

FROM openjdk:8-alpine
WORKDIR /
EXPOSE 8090
COPY target/blockchain-0.0.1-SNAPSHOT.jar blockchain.jar
CMD java -jar blockchain.jar

REST容器创建

docker container run --rm -p 8090:8090 --ip 172.18.0.3 --net multichain-network --name multichain-app bc59

测试容器以运行Curl和响应

docker container run --rm -it --net multichain-network --ip 172.18.0.4 byrnedo/alpine-curl http://172.18.0.3:8090/api/blockchain/address/create
curl: (7) Failed to connect to 172.18.0.3 port 8090: Connection refused

Netstat -a响应

$ docker exec multichain-app netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:http-alt        0.0.0.0:*               LISTEN      
tcp        0      0 localhost:41183         0.0.0.0:*               LISTEN      
udp    34560      0 localhost:34462         0.0.0.0:*                           
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         STREAM     CONNECTED     456199

我不明白为什么端口8090没有显示在netstat命令中,因为我在Dockerfile中定义了端口,并且还指定了-p标志。有人可以帮我一下吗?

2 个答案:

答案 0 :(得分:2)

您必须将主机上的8090端口映射到容器上的8080端口,如下所示:

docker container run --rm -p 8090:8080 --ip 172.18.0.3 --net multichain-network --name multichain-app bc59

区别在这里:-p 8090:8080

来自the Docker documentation

  

EXPOSE指令实际上并未发布端口。它   充当构建者之间的一种文档类型   图片和运行容器的人,关于哪些端口是   打算出版。在运行时实际发布端口   容器,使用docker run上的-p标志发布并映射一个或   更多端口,或使用-P标志发布所有公开的端口并映射它们   到高阶端口。

答案 1 :(得分:1)

首先,EXPOSE不会更改应用程序(容器中)正在侦听的端口,也不会将端口绑定到主机。因此,以下问题是最重要的。

您的REST API server正在监听哪个端口?这是我们应该知道的最重要的事情。

EXPOSE 8090 仅是构建映像的人员和使用映像运行容器的人员之间的一种文档,这意味着只有-p标志才能将主机上的8090映射到容器中的8090 。

-p 8090:8090 是正确的指令,可以在有或没有EXPOSE的情况下进行端口映射。它可能会以某种方式(自从我自己的限制以来,我无法对其进行更详细地介绍)由docker-proxy在主机上提出了一个过程。如下所示:

/usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8090 -container-ip x.x.x.x -container-port 8090

首先,您必须确认REST API服务器的监听端口,然后将-p 8090:your-rest-api-server-port添加到docker run命令中。现在您的主机上可能有8090。

希望这会有所帮助〜