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

Spring Boot连接Docker中PostgreSQL遇pg_hba.conf及SSL问题求助

解决Spring Boot连接Docker PostgreSQL的pg_hba.conf与SSL问题

方案一:快速规避pg_hba.conf错误(无需SSL)

这个错误核心是PostgreSQL默认的pg_hba.conf未允许Spring Boot容器所在的网段连接。Docker Compose默认会为服务创建专属内部网络,只需让Postgres信任该网络的连接即可:

操作步骤

  1. 修改docker-compose.yml,移除Spring Boot数据源的SSL参数,同时给Postgres添加信任配置:

    services:
      belt-microservice:
        build: belt-microservices
        container_name: belt-microservice
        restart: always
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql://db-belt:5432/belt_microservices
          - SPRING_DATASOURCE_USERNAME=postgres
          - SPRING_DATASOURCE_PASSWORD=password
        ports:
          - "8080:8080"
        depends_on:
          - db-belt
      db-belt:
        image: postgres
        container_name: db-belt
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=password
          - POSTGRES_DB=belt_microservices
          - PGDATA=/var/lib/postgresql/data/pgdata
          - POSTGRES_HOST_AUTH_METHOD=trust # 测试环境快速允许所有连接
        ports:
          - "5000:5432"
        volumes:
          - pgdata:/var/lib/postgresql/data
        restart: always
    volumes:
      pgdata:
    

    生产环境注意:不要用trust,建议自定义pg_hba.conf挂载到容器,添加允许Docker网段的规则。例如创建pg_hba.conf文件,添加一行host all all 172.17.0.0/16 md5(Docker默认网桥网段),然后在db-belt的volumes中添加- ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf。

  2. 重启容器生效:

    docker-compose down && docker-compose up -d
    

方案二:配置PostgreSQL容器支持SSL连接

如果业务要求必须使用SSL,需要生成自签名证书并配置Postgres:

操作步骤

  1. 生成SSL证书(用OpenSSL生成自签名证书):

    # 创建证书目录
    mkdir -p ./postgres-ssl && cd ./postgres-ssl
    # 生成根证书
    openssl req -new -x509 -days 365 -nodes -text -out root.crt -keyout root.key -subj "/CN=root"
    # 生成服务器证书
    openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=db-belt"
    openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt
    # 修改证书权限,适配Postgres要求
    chmod 600 server.key root.key
    
  2. 修改docker-compose.yml,挂载证书并启用SSL:

    services:
      belt-microservice:
        build: belt-microservices
        container_name: belt-microservice
        restart: always
        environment:
          - SPRING_DATASOURCE_URL=jdbc:postgresql://db-belt:5432/belt_microservices?ssl=true&sslmode=verify-ca&sslrootcert=/postgres-ssl/root.crt
          - SPRING_DATASOURCE_USERNAME=postgres
          - SPRING_DATASOURCE_PASSWORD=password
        ports:
          - "8080:8080"
        depends_on:
          - db-belt
        volumes:
          - ./postgres-ssl:/postgres-ssl # 挂载证书到Spring Boot容器
      db-belt:
        image: postgres
        container_name: db-belt
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=password
          - POSTGRES_DB=belt_microservices
          - PGDATA=/var/lib/postgresql/data/pgdata
          - POSTGRES_SSL=on # 启用SSL
          - POSTGRES_SSL_CERT_FILE=/var/lib/postgresql/data/server.crt
          - POSTGRES_SSL_KEY_FILE=/var/lib/postgresql/data/server.key
          - POSTGRES_SSL_CA_FILE=/var/lib/postgresql/data/root.crt
        ports:
          - "5000:5432"
        volumes:
          - ./postgres-ssl/server.crt:/var/lib/postgresql/data/server.crt
          - ./postgres-ssl/server.key:/var/lib/postgresql/data/server.key
          - ./postgres-ssl/root.crt:/var/lib/postgresql/data/root.crt
          - pgdata:/var/lib/postgresql/data
        restart: always
    volumes:
      pgdata:
    
  3. 重启容器生效:

    docker-compose down && docker-compose up -d
    

额外排查要点

  • 之前添加的networks: default: external: false属于冗余配置,Docker Compose默认会创建内部专属网络,无需额外声明;若存在残留网络问题,可执行docker network prune清理无用网络后重启。
  • 测试容器连通性:进入Spring Boot容器执行ping db-belt,确认主机名解析正常。
  • 查看Postgres日志:执行docker logs db-belt,排查启动或连接相关的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:53:25