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

Docker-Compose部署Linux VPS时Spring Boot无法连接PostgreSQL

Spring Boot微服务Docker Compose部署Linux VPS时数据库连接失败问题

我有多个基于Spring Boot的微服务,每个服务都配有独立的PostgreSQL数据库。在Windows开发机上执行docker-compose up可以正常运行,但部署到Linux VPS主机时,Spring Boot无法连接数据库。不过单独启动镜像(不使用环境变量)在VPS上是可行的。

我的docker-compose.yml配置

version: "3.9"

services:
 gateway:
  image: gateway:latest
  container_name: gateway
  ports:
    - "8080:8080"
  depends_on:
    - postgres
  environment:
    - DATASOURCE_URL=jdbc:postgresql://postgres:5432/gateway_db
    - DATASOURCE_USERNAME=postgres
    - DATASOURCE_PASSWORD=postgres
    - JPA_HIBERNATE_DDL_AUTO=update
  restart: unless-stopped
  networks:
    - postgres

 postgres:
  image: postgres:14.4
  container_name: gateway_db
  environment:
    POSTGRES_DB: "gateway_db"
    POSTGRES_USER: "postgres"
    POSTGRES_PASSWORD: "postgres"
  volumes:
    - pgdata:/var/lib/postgresql/data
  expose:
    - 5432
  healthcheck:
    test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ]
    interval: 10s
    timeout: 5s
    retries: 5
    start_period: 10s
  restart: unless-stopped
  networks:
    - postgres

volumes:
  pgdata:

networks:
  postgres:
    driver: bridge

我的application.properties配置

spring.datasource.driver-class-name=org.postgresql.Driver
spring.sql.init.mode=always
spring.sql.init.platform=postgres
spring.datasource.url=${DATASOURCE_URL}
spring.datasource.username=${DATASOURCE_USERNAME}
spring.datasource.password=${DATASOURCE_PASSWORD}

spring.jpa.database=postgresql
spring.jpa.hibernate.ddl-auto=${JPA_HIBERNATE_DDL_AUTO}

容器日志关键错误信息

org.postgresql.util.PSQLException: Connection to postgres:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:319)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
    at org.postgresql.Driver.makeConnection(Driver.java:465)
    at org.postgresql.Driver.connect(Driver.java:264)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    ...

可能的原因及解决方案

1. 依赖启动顺序问题

depends_on仅保证postgres容器启动,但不会等待数据库服务就绪。即使配置了healthcheck,默认也不会基于健康状态启动gateway,导致Spring服务在数据库未就绪时尝试连接。

  • 解决方法:修改gateway服务的depends_on配置,添加健康检查依赖:
    depends_on:
      postgres:
        condition: service_healthy
    

2. 容器网络解析差异

Windows和Linux的Docker网络解析存在细微差异,尝试用容器名代替服务名访问数据库:

  • 解决方法:修改gateway的DATASOURCE_URL为jdbc:postgresql://gateway_db:5432/gateway_db(gateway_db是postgres容器的名称)。

3. 环境变量传递格式问题

Linux环境下Docker Compose的环境变量格式可能存在兼容性问题,尝试换用冒号格式定义环境变量:

  • 解决方法:修改gateway服务的环境变量配置:
    environment:
      DATASOURCE_URL: jdbc:postgresql://postgres:5432/gateway_db
      DATASOURCE_USERNAME: postgres
      DATASOURCE_PASSWORD: postgres
      JPA_HIBERNATE_DDL_AUTO: update
    

4. Linux主机防火墙/安全组限制

检查Linux VPS的防火墙(如ufw、iptables)或云服务商安全组是否限制了容器间的5432端口通信:

  • 解决方法:
    • 执行ufw allow docker允许Docker网络流量;
    • 云VPS需确保安全组允许内部容器间的5432端口访问(同一Docker网络下通常无需配置,但部分环境可能有严格限制)。

5. PostgreSQL连接配置检查

确认PostgreSQL容器允许来自Docker网络的连接:

  • 解决方法:进入postgres容器查看pg_hba.conf配置:
    docker exec gateway_db cat /var/lib/postgresql/data/pg_hba.conf
    
    确保存在host all all 0.0.0.0/0 md5规则(postgres镜像默认包含该规则,若自定义过需调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:48:27