You need to enable JavaScript to run this app. Docker环境下Laravel无法连接PostgreSQL数据库,本地客户端连接正常
优惠活动
大模型
产品
解决方案
定价
更多

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]报错。
修复方法
  1. 直接改项目根目录的.env数据库配置:
    • 把DB_HOST从127.0.0.1改成docker-compose里定义的postgis服务名postgis
    • DB_PORT保持5432就行,容器之间的内部通信根本不走宿主机的端口映射,直接走PostGIS容器内部暴露的原生端口
      docker-compose默认会给同项目下的所有服务建共用桥接网络,内置的DNS会自动把postgis这个服务名解析到对应容器的内网IP,你配置里本来就用links关联了postgis服务,这个解析是必然生效的。
  2. 改完先做连通性验证,别直接刷页面:
    • 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 01:45:04