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

Docker部署SpringBoot+PostgreSQL时连接拒绝故障求助

SpringBoot Docker镜像连接PostgreSQL报Connection Refused的常见原因

以下是导致该错误的核心原因及排查方向:

  • 数据库地址配置错误
    Docker容器内的localhost指向容器自身,而非宿主机或其他容器。如果PostgreSQL是通过docker-compose部署的服务,需将SpringBoot配置中的数据库主机名改为compose文件里的PostgreSQL服务名称(比如postgres);如果PostgreSQL运行在宿主机,需替换为宿主机的实际IP或Docker网关IP(通常是172.17.0.1)。
    错误示例:spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
    正确示例(compose场景):spring.datasource.url=jdbc:postgresql://postgres:5432/mydb

  • PostgreSQL未正常启动或端口未映射

    • 若用docker-compose管理,执行docker-compose ps检查PostgreSQL服务的状态是否为up;
    • 若单独运行PostgreSQL容器,需确保启动时添加了端口映射参数-p 5432:5432,否则外部容器无法访问容器内的5432端口。
  • PostgreSQL禁止远程连接
    PostgreSQL默认仅允许本地连接,需修改配置开启远程访问:

    • 修改postgresql.conf中的listen_addresses = '*';
    • 修改pg_hba.conf,添加规则host all all 0.0.0.0/0 md5允许所有IP访问;
    • 使用官方PostgreSQL镜像时,可临时通过环境变量POSTGRES_HOST_AUTH_METHOD=trust跳过认证(仅测试环境使用,生产环境需配置密码认证)。
  • 容器网络不互通
    SpringBoot容器与PostgreSQL容器需处于同一Docker网络才能互相访问:

    • docker-compose会自动创建专属网络,无需额外配置;
    • 若单独启动容器,需先创建网络docker network create my-network,再分别用--network my-network参数启动两个容器。
  • 服务启动顺序问题
    SpringBoot容器启动速度快于PostgreSQL初始化速度,导致连接时数据库尚未就绪。可通过docker-compose的健康检查机制控制启动顺序:

    services:
      postgres:
        image: postgres:15
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U postgres"]
          interval: 5s
          timeout: 5s
          retries: 5
      spring-app:
        build: .
        depends_on:
          postgres:
            condition: service_healthy
    
  • 宿主机防火墙拦截
    若PostgreSQL运行在宿主机,需检查宿主机防火墙是否开放了5432端口,比如Ubuntu下执行ufw allow 5432,CentOS下执行firewall-cmd --add-port=5432/tcp --permanent && firewall-cmd --reload。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:02:37