You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Spring Boot启动成功但API调用报socket hang up错误

核心问题

你的配置存在多处逻辑冲突,直接导致服务无法正常访问:

  • docker-compose.yml同层级重复定义image字段,YAML语法下同key会取最后一个值,你写的build构建逻辑完全失效:compose不会执行你写的Dockerfile生成可执行jar镜像,而是直接拉取tomcat:9.0-jdk8原生镜像启动,容器里根本没有你打包的业务应用
  • 端口映射和服务监听端口不匹配:你配置的端口映射是8089:8080(宿主机8089端口转发到容器内8080端口),但从日志看你的SpringBoot内置Tomcat实际监听容器内8089端口,转发到8080的请求没有对应服务处理,连接直接被断开就会触发socket hang up错误
  • 运行模式配置混乱:你既写了基于openjdk直接跑可执行jar的Dockerfile,又在compose里配置了独立tomcat镜像的挂载目录、JAVA_OPTS参数,两套运行逻辑混写,大部分配置都是无效的。另外你配置的db.host=localhost也有问题:容器内localhost指向容器自身,后续接口连接PostgreSQL会直接失败。
修复方案

选择一种运行模式调整配置即可,推荐用更简单的内置Tomcat跑jar的模式:

1. 修改docker-compose.yml

删除重复的image配置、无效的tomcat挂载配置,调整端口映射匹配应用监听端口:

version: '3.3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      # 宿主机8089转发到容器内应用实际监听的8089端口
      - '8089:8089'
    environment:
      # 注意将db.host替换为PostgreSQL实际可访问的IP,不要填localhost
      - JAVA_OPTS=-Ddb.host=数据库实际访问地址 -Ddb.catalog=gohybridit_dev -Ddb.port=5432 -Ddb.username=postgres -Ddb.password=123

2. 修改Dockerfile

调整启动命令确保JAVA_OPTS环境变量可以正常生效:

FROM openjdk:8-jdk-alpine
WORKDIR /opt/app
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

3. 重启验证

执行命令清理旧的无效容器和镜像,重新启动服务:

docker-compose down
docker image prune -f
docker-compose up --build

启动后确认日志中Tomcat监听8089端口,再通过Postman访问对应接口即可正常连通。

如果你要选择独立Tomcat部署war包的模式,需要把项目打包为war包,重写Dockerfile基于tomcat:9.0-jdk8镜像构建,将war包复制到webapps目录下,同时保留compose中对应的tomcat配置,端口映射调整为和容器内tomcat监听端口一致即可。

内容的提问来源于stack exchange,提问作者Alaa Ebeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:30:58