Docker容器化Spring Boot应用后客户端无法连接问题
Spring Boot容器化后外部客户端无法连接(Connection refused)问题排查与解决
问题场景
- 服务器直接运行Spring Boot应用:执行
java -jar springdemo-0.0.1-SNAPSHOT.jar,跨设备客户端通过curl http://serverip:34256/api/test可正常获取响应:
{ "One": 1, "Two": 2, "Three": 3 }
- 容器化操作后:执行
docker build -t java-image .和docker run -p 34256:34256 --name java-container java-image,客户端连接报错:
curl: (7) Failed to connect to serverip port 34256 after 55 ms: Connection refused
- 应用配置
application.properties:
server.address=0.0.0.0 server.port=34256
- Dockerfile内容:
FROM openjdk:17-alpine ARG PORT=34256 MAINTAINER me EXPOSE ${PORT} COPY ./springdemo-*.jar ./springdemo-*.jar CMD ["java","-jar","springdemo-*.jar"]
排查与解决步骤
1. 修复Dockerfile的jar包通配符问题
当前Dockerfile的CMD使用了springdemo-*.jar通配符,但exec模式(["command", "args"])不会解析shell通配符,java进程会尝试直接运行名为springdemo-*.jar的文件,而该文件不存在,导致应用根本未启动。
解决方案:
修改Dockerfile,改用固定文件名或shell模式执行命令:
方案一:重命名jar包并使用shell模式
FROM openjdk:17-alpine ARG PORT=34256 MAINTAINER me EXPOSE ${PORT} COPY ./springdemo-*.jar ./app.jar CMD java -jar app.jar
方案二:明确指定jar包全名
FROM openjdk:17-alpine ARG PORT=34256 MAINTAINER me EXPOSE ${PORT} COPY ./springdemo-0.0.1-SNAPSHOT.jar ./springdemo-0.0.1-SNAPSHOT.jar CMD ["java","-jar","springdemo-0.0.1-SNAPSHOT.jar"]
2. 验证容器内应用状态
修复Dockerfile后重新构建并运行容器,进入容器内部确认应用是否正常启动:
- 进入容器:
docker exec -it java-container sh - 检查java进程:
ps aux,确认存在java运行进程 - 检查端口监听:安装工具
apk add net-tools后,执行netstat -tulpn,确认34256端口被java进程监听,且监听地址为0.0.0.0
3. 确认端口映射生效
在服务器执行docker ps,查看PORTS列是否显示0.0.0.0:34256->34256/tcp或:::34256->34256/tcp,确保端口映射绑定到服务器所有网卡(而非仅本地回环127.0.0.1)。
4. 检查服务器防火墙/安全组
确认服务器防火墙(如ufw、iptables)或云服务商安全组已放行34256端口的入站流量:
- ufw命令:
ufw allow 34256/tcp - iptables命令:
iptables -A INPUT -p tcp --dport 34256 -j ACCEPT - 云服务器需在控制台安全组中添加对应端口的入站规则
5. 验证容器内接口可用性
在容器内部执行curl http://localhost:34256/api/test,若能正常返回响应,说明应用运行正常,问题出在外部网络层面;若不能返回,回到步骤1重新排查应用启动问题。
内容的提问来源于stack exchange,提问作者for_and_pear_max_no
相关产品推荐
相关产品推荐

