Symfony 4+Docker环境下无法连接PostgreSQL的问题
这种情况我之前搭建环境时也踩过好几次坑,核心问题基本都出在容器网络隔离或者配置参数不匹配上,咱们一步步来排查:
检查数据库连接的主机名配置
你本地用psql能连是因为用的宿主机IP,但PHP代码是跑在容器里的,localhost或者127.0.0.1指的是PHP容器本身,不是宿主机的PostgreSQL。要改成docker-compose里PostgreSQL服务的名称(比如你配置里的db),这才是容器网络里的正确主机名。验证.env文件是否被PHP容器正确加载
有时候docker-compose没把宿主机的.env文件挂载到PHP容器里,或者挂载路径不对,导致代码读到的数据库凭据是空的。你可以进入PHP容器执行:docker exec -it <php容器名> printenv | grep DB_看看输出的DB_HOST、DB_USER、DB_PASSWORD这些参数是不是和你本地用的一致。
检查PostgreSQL的网络监听配置
默认PostgreSQL可能只监听localhost,要修改postgresql.conf里的参数:listen_addresses = '*'同时在
pg_hba.conf里添加允许PHP容器所在网段的访问规则,比如docker默认子网是172.17.0.0/16,就加:host all all 172.17.0.0/16 md5修改后重启PostgreSQL容器生效。
测试容器间的网络连通性
进入PHP容器,用以下命令测试能不能连到PostgreSQL容器:# 先ping服务名,看DNS解析是否正常 ping db # 再测试5432端口是否开放 telnet db 5432如果ping不通,检查docker-compose.yml里是不是所有服务都加入了同一个自定义网络?默认的bridge网络有时候会有解析问题,最好手动定义一个网络让PHP、Nginx、PostgreSQL都加入。
查看PHP/Nginx的错误日志
别光看网页的模糊提示,去看PHP容器里的错误日志(比如/var/log/php-fpm.log)或者Nginx的访问日志,里面会有更具体的错误信息——比如是连接被拒绝,还是密码错误,或者用户没有权限,这些细节能直接帮你定位问题。确认数据库用户的访问权限
本地psql能连不代表容器能连,因为本地是从宿主机IP访问,容器是另一个IP段。你可以用本地psql登录后执行:SELECT usename, host FROM pg_user;看看你用的数据库用户的
host是不是%(允许所有IP),或者包含容器所在的网段。如果是localhost,那容器肯定连不上,需要修改用户权限:ALTER USER your_user WITH LOGIN PASSWORD 'your_password' HOST '%';
先从这几点入手排查,大概率能找到问题。如果有具体的错误日志或者docker-compose.yml片段,也能更精准地帮你定位。
内容的提问来源于stack exchange,提问作者James May

