Docker部署SpringBoot+PostgreSQL时连接拒绝故障求助
以下是导致该错误的核心原因及排查方向:
数据库地址配置错误
Docker容器内的localhost指向容器自身,而非宿主机或其他容器。如果PostgreSQL是通过docker-compose部署的服务,需将SpringBoot配置中的数据库主机名改为compose文件里的PostgreSQL服务名称(比如postgres);如果PostgreSQL运行在宿主机,需替换为宿主机的实际IP或Docker网关IP(通常是172.17.0.1)。
错误示例:spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
正确示例(compose场景):spring.datasource.url=jdbc:postgresql://postgres:5432/mydbPostgreSQL未正常启动或端口未映射
- 若用docker-compose管理,执行
docker-compose ps检查PostgreSQL服务的状态是否为up; - 若单独运行PostgreSQL容器,需确保启动时添加了端口映射参数
-p 5432:5432,否则外部容器无法访问容器内的5432端口。
- 若用docker-compose管理,执行
PostgreSQL禁止远程连接
PostgreSQL默认仅允许本地连接,需修改配置开启远程访问:- 修改
postgresql.conf中的listen_addresses = '*'; - 修改
pg_hba.conf,添加规则host all all 0.0.0.0/0 md5允许所有IP访问; - 使用官方PostgreSQL镜像时,可临时通过环境变量
POSTGRES_HOST_AUTH_METHOD=trust跳过认证(仅测试环境使用,生产环境需配置密码认证)。
- 修改
容器网络不互通
SpringBoot容器与PostgreSQL容器需处于同一Docker网络才能互相访问:- docker-compose会自动创建专属网络,无需额外配置;
- 若单独启动容器,需先创建网络
docker network create my-network,再分别用--network my-network参数启动两个容器。
服务启动顺序问题
SpringBoot容器启动速度快于PostgreSQL初始化速度,导致连接时数据库尚未就绪。可通过docker-compose的健康检查机制控制启动顺序:services: postgres: image: postgres:15 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 spring-app: build: . depends_on: postgres: condition: service_healthy宿主机防火墙拦截
若PostgreSQL运行在宿主机,需检查宿主机防火墙是否开放了5432端口,比如Ubuntu下执行ufw allow 5432,CentOS下执行firewall-cmd --add-port=5432/tcp --permanent && firewall-cmd --reload。
内容的提问来源于stack exchange,提问作者Stephen Muindi

