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

Dockerfile运行Spring Boot应用时无法连接本地PostgreSQL如何解决

问题成因

报错信息:Connection to localhost:5432 refused

  • Docker 容器默认拥有独立的网络命名空间,容器内部的localhost指向容器本身,而非运行Docker的宿主机器。
  • 直接在宿主运行Spring Boot应用时,访问的localhost:5432是宿主端口映射的PostgreSQL服务;但应用打包为容器运行后,内部访问localhost:5432会请求容器自身的5432端口,该端口没有运行数据库服务,因此触发连接拒绝错误。
修复方案

方案1:通过宿主专属域名访问(适合开发调试场景)

  • Windows/Mac 版Docker Desktop 内置了特殊域名host.docker.internal,可直接指向宿主机器,只需将Spring Boot配置文件中的数据库连接地址从localhost:5432修改为host.docker.internal:5432,重新打包镜像即可正常连接。
  • Linux 环境需要在启动应用容器时添加额外参数配置宿主映射,启动命令示例:
    docker run -d --add-host=host.docker.internal:host-gateway <你的应用镜像名称>
    修改后同样将数据库地址改为host.docker.internal:5432即可。

方案2:同自定义网络互通(推荐生产/测试环境使用)

将应用容器和PostgreSQL容器加入同一个Docker自定义网络,可通过容器别名直接访问数据库,不需要暴露数据库端口到公网,安全性更高:

  1. 创建自定义网桥网络:
    docker network create spring-app-network
  2. 重启PostgreSQL容器,指定加入该网络并设置网络别名:
    docker run -d --network spring-app-network --network-alias postgres -p 5432:5432 -e POSTGRES_PASSWORD=<你的数据库密码> postgres:<对应版本号>
  3. 修改Spring Boot配置中的数据库连接地址为postgres:5432(和上述网络别名一致),重新打包应用镜像。
  4. 启动应用容器时指定加入同一个网络:
    docker run -d --network spring-app-network <你的应用镜像名称>

方案3:共享宿主网络(仅Linux可用,临时调试使用)

启动应用容器时添加--net=host参数,容器将直接共享宿主的网络命名空间,此时容器内部的localhost和宿主完全一致,不需要修改任何应用配置:
docker run -d --net=host <你的应用镜像名称>

注意:该模式会打破容器的网络隔离,不建议在生产环境使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:06:06