Docker部署Spring+Postgres应用时localhost:5432连接被拒绝求助
解决Docker容器中Spring Boot应用连接PostgreSQL被拒绝的问题
核心原因
容器内的localhost指向容器自身的网络栈,而非宿主机。你本地运行的PostgreSQL在宿主机上,容器直接用localhost:5432会尝试连接容器内部的5432端口,自然会被拒绝。
具体解决方案
情况1:连接宿主机上的本地PostgreSQL
修改Spring配置文件
在application.properties中,将数据库URL的主机部分从localhost替换为Windows Docker专属的宿主机地址host.docker.internal:spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/your_database_name spring.datasource.username=your_username spring.datasource.password=your_password调整PostgreSQL监听配置
- 打开PostgreSQL的配置文件
postgresql.conf(通常在C:\Program Files\PostgreSQL\16\data目录下),修改listen_addresses为*,允许所有地址监听:listen_addresses = '*' - 打开
pg_hba.conf,添加一条规则允许Docker容器网段的连接:host all all 0.0.0.0/0 scram-sha-256 - 重启PostgreSQL服务使配置生效。
- 打开PostgreSQL的配置文件
情况2:通过Docker Compose同时启动PostgreSQL和Spring应用
如果你的Compose.yaml里定义了PostgreSQL服务,直接用服务名作为数据库主机地址即可:
- Compose.yaml示例
version: '3.8' services: postgres: image: postgres:16 environment: POSTGRES_DB: your_database_name POSTGRES_USER: your_username POSTGRES_PASSWORD: your_password ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data spring-app: build: . depends_on: - postgres environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/your_database_name SPRING_DATASOURCE_USERNAME: your_username SPRING_DATASOURCE_PASSWORD: your_password volumes: postgres_data: - 修改Spring配置
确保application.properties中的数据库主机为Compose里的PostgreSQL服务名(比如上面的postgres):spring.datasource.url=jdbc:postgresql://postgres:5432/your_database_name
额外验证步骤
- 执行
docker exec -it <your-spring-container-id> ping host.docker.internal,验证容器能否连通宿主机 - 在PowerShell中执行
Get-NetTCPConnection -LocalPort 5432,确认PostgreSQL服务的LocalAddress包含0.0.0.0或你的宿主机IP,确保服务已对外开放端口
内容的提问来源于stack exchange,提问作者R TheWriter
相关产品推荐
相关产品推荐

