我有一个在 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),而不是我开始时考虑的大量端口。