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.confhost all all 0.0.0.0/0 md5规则(postgres镜像默认包含该规则,若自定义过需调整)。
内容的提问来源于stack exchange,提问作者Maxim Tsirikov
相关产品推荐
相关产品推荐

