Docker环境下Laravel无法连接PostgreSQL数据库,本地客户端连接正常
连接失败的核心原因
问题本质是Docker网络隔离导致的主机地址配置错配,和数据库凭证、权限、PHP扩展没有关系:
- 你在PhpStorm客户端里填
127.0.0.1:5432能正常连库,是因为你已经把postgis容器的5432端口映射到了宿主机,PhpStorm跑在宿主机上,走回环地址就能命中端口映射规则,顺利连上PostGIS。 - 但Laravel是跑在独立的
php-hap容器里的,这个容器的网络栈和宿主机是完全隔离的,.env里填的127.0.0.1指的是php-hap容器自己的回环地址——这个地址上根本没有跑PostgreSQL服务,自然会抛连接被拒绝的错误,也就是你看到的SQLSTATE[08006] [7]报错。
修复方法
- 直接改项目根目录的
.env数据库配置:- 把
DB_HOST从127.0.0.1改成docker-compose里定义的postgis服务名postgis DB_PORT保持5432就行,容器之间的内部通信根本不走宿主机的端口映射,直接走PostGIS容器内部暴露的原生端口
docker-compose默认会给同项目下的所有服务建共用桥接网络,内置的DNS会自动把postgis这个服务名解析到对应容器的内网IP,你配置里本来就用links关联了postgis服务,这个解析是必然生效的。
- 把
- 改完先做连通性验证,别直接刷页面:
- 执行
docker exec -it 你的php-hap容器名 bash进到容器里 - 跑
nc -zv postgis 5432,如果返回连接成功,说明网络已经通了 - 再在容器里执行
php artisan migrate:status,正常的话就能看到迁移列表,不会再报连接错误。
- 执行
容易踩的坑
- 别把端口映射的作用搞混:postgis服务配的宿主机5432映射,是专门给宿主机上跑的客户端(比如你的PhpStorm)用的,容器间通信不需要靠这个映射
- 可以顺手确认下pdo_pgsql扩展真的装上了:进php-hap容器跑
php -m | grep pdo_pgsql,没输出的话要回Dockerfile补装,不过你现在的报错是网络层的,和扩展没关系 - 原来的links配置留不留都不影响:现在docker-compose的自定义网络已经自动实现了服务间主机名解析,links只是早期版本的兼容配置,不会挡路。
内容的提问来源于stack exchange,提问作者Klick
相关产品推荐
相关产品推荐

