Spring boot inside docker container throws java.net.ConnectException: Connection refused (连接被拒绝)
Spring boot inside docker container throws java.net.ConnectException: Connection refused (Connection refused)
客户端 应用程序将 json
数据发送到 localhost:8080 上的服务器并打包 运行 作为 docker 图像。使用 Postman chrome 应用程序手动发送 json 时服务器工作正常。问题是 dockerized client 在尝试使用 OutputStreamWriter
将 json
写入 HttpURLConnection
时抛出 java.net.ConnectException: Connection refused (Connection refused)
。如何让它发挥作用?
Docker 文件:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/client-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8088
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
在 docker 中,每个容器都有自己的虚拟化网络堆栈 - localhost 是容器的环回接口地址,而不是主机环回接口的地址。
您必须将客户端配置为使用其主机名连接到服务器。如果您正在使用 docker-compose
,则只需服务器的容器名称;如果您 运行 手动启动容器,则只需 docker 主机的主机名。
两个客户端应该 运行 在同一个网络上。
所以创建网桥MY_BRIDGE
:
docker network create MY_BRIDGE
将两个容器连接到桥上,运行连接它们。为服务器容器命名 MY_SERVER
:
docker run --network MY_BRIDGE --name MY_SERVER MY_SERVER_IMAGE
docker run --network MY_BRIDGE MY_CLIENT_IMAGE
在 运行 启用客户端容器之前,您的应用程序代码必须从 localhost:8080
更改为 MY_SERVER:8080
。
客户端 应用程序将 json
数据发送到 localhost:8080 上的服务器并打包 运行 作为 docker 图像。使用 Postman chrome 应用程序手动发送 json 时服务器工作正常。问题是 dockerized client 在尝试使用 OutputStreamWriter
将 json
写入 HttpURLConnection
时抛出 java.net.ConnectException: Connection refused (Connection refused)
。如何让它发挥作用?
Docker 文件:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/client-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8088
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
在 docker 中,每个容器都有自己的虚拟化网络堆栈 - localhost 是容器的环回接口地址,而不是主机环回接口的地址。
您必须将客户端配置为使用其主机名连接到服务器。如果您正在使用 docker-compose
,则只需服务器的容器名称;如果您 运行 手动启动容器,则只需 docker 主机的主机名。
两个客户端应该 运行 在同一个网络上。
所以创建网桥MY_BRIDGE
:
docker network create MY_BRIDGE
将两个容器连接到桥上,运行连接它们。为服务器容器命名 MY_SERVER
:
docker run --network MY_BRIDGE --name MY_SERVER MY_SERVER_IMAGE
docker run --network MY_BRIDGE MY_CLIENT_IMAGE
在 运行 启用客户端容器之前,您的应用程序代码必须从 localhost:8080
更改为 MY_SERVER:8080
。