我的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标志。有人可以帮我一下吗?
答案 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
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。
希望这会有所帮助〜