Docker容器中Spring Boot应用无法连接PostgreSQL容器数据库
解决Docker容器中Spring Boot无法连接PostgreSQL的问题
问题根源在于容器网络的访问逻辑:Spring Boot容器内的localhost指向容器自身,而非宿主机,你配置的jdbc:postgresql://localhost:5050/security-db会尝试连接Spring Boot容器自己的5050端口,自然找不到PostgreSQL服务。
修复方案(推荐):使用Docker Compose服务名作为数据库主机名
Docker Compose会自动为同一配置下的服务创建共享网络,且可以通过服务名直接访问其他容器。只需修改application.properties中的数据库连接URL:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect # 将localhost:5050替换为db:5432(db是docker-compose.yml中PostgreSQL服务的名称,5432是容器内部默认端口) spring.datasource.url=jdbc:postgresql://db:5432/security-db spring.datasource.username=scrty spring.datasource.password=scrty123 spring.jpa.hibernate.ddl-auto=update
关键说明:
- 容器间通信不需要依赖宿主机的端口映射(
5050:5432),该映射仅用于宿主机外部访问数据库,容器内部直接用PostgreSQL默认端口5432即可。 - 确保Spring Boot应用通过
docker-compose up启动(需在docker-compose.yml中添加Spring Boot服务配置),这样它会自动加入与db服务相同的网络,才能通过服务名访问。
备选方案(不推荐,移植性差):使用宿主机IP地址
如果必须通过宿主机端口访问,可将localhost替换为宿主机的实际IP地址(如192.168.1.100),但该方式在不同环境下需修改IP,灵活性差。
内容的提问来源于stack exchange,提问作者demirs
相关产品推荐
相关产品推荐

