无法从外部 PC 连接到在 Docker 容器中运行的 Java 应用程序 - Linux

无法从外部 PC 连接到在 Docker 容器中运行的 Java 应用程序 - Linux

我有一个在 Docker 容器中运行的 Java 服务器应用程序。该容器在 Linux 服务器(Ubuntu 18.04 LTS)中运行,具有静态 IP 地址。在 PC 中运行的另一个 Java 应用程序必须连接到 Java 服务器应用程序。

服务器应用程序监听 TCP 连接请求,PC 应用程序可以打开 TCP 连接,了解服务器应用程序的端口和静态 IP 地址。

假设应用服务器在端口 5000 上侦听 TCP 连接请求;然后,当 TCP 连接从外部到达时,TCP 服务器将释放一个连接,并分配 5000-20000 范围内的端口。那么第一个问题是,这个 5000-20000 范围是否要公开?

以前,Java 服务器应用程序在 Linux 服务器中运行,无需容器,并且可以正常工作。

现在,对于 Docker 容器内的服务器应用程序,连接被拒绝;我猜测是端口存在问题。

Java 应用程序由如下 dockerfile 配置:

FROM openjdk:8-oraclelinux8
WORKDIR /mydir
# VOLUME . /
COPY ["./My_name_Java_app.jar", "./My_name_Java_app.properties", "./"]
EXPOSE 80
EXPOSE 8080
EXPOSE 5000-20000
ENTRYPOINT ["/bin/java", "-Djava.awt.headless=true", "-jar", "My_name_Java_app.jar"]

我已经读过我必须在 Docker 运行命令上发布端口,但是当我通过以下方式运行容器时:

docker run -d --name my_container -p 5000-20000:5000-20000/tcp -p 80:80 -p 8080:8080 -v /root/my_app/volume:/mydir my_image

我收到以下错误(在 Linux 终端中 - 请注意,最后的句号就是我收到的):

linux docker: Error response from daemon xxxxxxxxx: driver failed programming external connectivity on endpoint Error starting userland proxy:.

所以我的最终目标是 PC 应用程序可以使用端口 5000 连接到服务器应用程序并在端口范围 (5001-20000) 内打开连接。

我还公开了端口 80 和 8080,因为服务器应用程序必须对网站执行一些 http 请求,所以我认为我必须公开端口 80 和 8080;另一个问题是我是否还必须通过 -p 选项公开和发布 80 和 8080?

顺便说一句,如果我删除(见下文)带有 80 和 8080 的 -p 选项,我总是会收到相同的错误。

docker run -d --name my_container -p 5000-20000:5000-20000/tcp -v /root/my_app/volume:/mydir my_image 

此外,如果我完全消除 -p 选项,容器就会启动并且不会出现错误。

答案1

已解决:故事结束时没有什么真正的错误,我只需要公开(在 dockerfile 中)并使用 -p 选项(在 docker run 命令中)我真正需要的唯一端口(即 5000),而不是我开始时考虑的大量端口。

相关内容