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

Spring Boot Docker容器连接本地PostgreSQL报Connection refused问题求助

这个问题的核心原因很明确——Docker容器里的localhost和你本地机器的localhost不是同一个东西!当你的Spring Boot应用在容器里尝试连接localhost:5432时,它其实是在找容器自己内部的PostgreSQL服务,但你是把PostgreSQL装在宿主机(本地机器)上的,所以肯定连不上,就会报连接拒绝的错误。

接下来给你几个可行的解决方案,你可以根据自己的场景选择:

方案1:用宿主机的真实IP代替localhost

这是最直接的修改方式:

  • 先找到你宿主机的IP地址:
    • Linux/macOS可以在终端执行ip addr show(Linux)或ifconfig(macOS),找类似192.168.x.x的私有IP;
    • Windows用ipconfig找本地连接的IPv4地址。
  • 修改你的Spring Boot配置文件(比如application.properties或application.yml)里的数据库连接URL,把localhost替换成刚才找到的IP,比如:
    spring.datasource.url=jdbc:postgresql://192.168.1.105:5432/你的数据库名
    
  • 别忘了给PostgreSQL开权限,允许容器所在网段的IP连接:
    1. 编辑PostgreSQL的pg_hba.conf文件(通常在/var/lib/postgresql/版本号/main/或/etc/postgresql/版本号/main/目录下),添加一行:
      host    你的数据库名     你的数据库用户名     172.17.0.0/16     md5
      
      (Docker默认的桥接网络网段是172.17.0.0/16,这行配置允许这个网段的机器连接)
    2. 编辑postgresql.conf文件,把listen_addresses改成'*',让PostgreSQL监听所有IP的请求;
    3. 重启PostgreSQL服务:sudo systemctl restart postgresql(Linux)或者在服务管理器里重启(Windows)。

方案2:用Docker的host网络模式运行容器

这个方案更简单,直接让容器共享宿主机的网络栈,这样容器里的localhost就等价于宿主机的localhost了:

  • 把运行容器的命令改成:
    sudo docker run --network host -t djtijare/a2i-web:v1
    
    注意这里不需要再加-p 8080:8080端口映射了,因为容器会直接使用宿主机的8080端口。

方案3:用Docker Compose把PostgreSQL和应用一起管理

如果是长期开发或部署,推荐用这种方式,把两个服务放进同一个Docker网络,互相访问更方便:

  • 在你的项目根目录(和Dockerfile同目录)创建一个docker-compose.yml文件,内容如下:
    version: '3.8'
    services:
      postgres:
        image: postgres:latest
        environment:
          POSTGRES_DB: 你的数据库名
          POSTGRES_USER: 你的数据库用户名
          POSTGRES_PASSWORD: 你的数据库密码
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data  # 持久化数据库数据
      a2i-web:
        build: .
        ports:
          - "8080:8080"
        depends_on:
          - postgres
        environment:
          SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/你的数据库名
          SPRING_DATASOURCE_USERNAME: 你的数据库用户名
          SPRING_DATASOURCE_PASSWORD: 你的数据库密码
    volumes:
      postgres_data:
    
  • 然后执行docker-compose up --build,它会自动构建你的应用镜像,启动PostgreSQL容器,并且两个服务可以通过服务名(比如postgres)互相访问,不用再纠结IP的问题。

这三个方案里,方案2适合快速测试,方案3适合生产或长期开发场景,方案1则是在不想动Docker配置时的折中选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:00:34