You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose环境下PHP PDO无法连接PostgreSQL求助

问题分析与解决方案

这个问题的核心在于Docker容器的网络栈独立性,我来帮你拆解清楚:

为什么会出现连接拒绝?

你在PHP代码里用127.0.0.1:5432连接PostgreSQL,但在Docker Compose的架构里:

  • 每个容器都是独立的网络环境,127.0.0.1在PHP容器里指向的是PHP容器自身,而不是宿主机或者PostgreSQL容器。
  • 你本地用DBeaver能连,是因为宿主机的127.0.0.1:5432已经通过Docker Compose的端口映射指向了PostgreSQL容器,但这个映射只对宿主机生效,容器内部无法通过这个地址访问其他容器。

正确的解决方法

Docker Compose会自动为所有服务创建一个共享的内部网络,并且可以通过服务名称直接解析到对应容器的IP地址。你需要修改PHP代码中的数据库连接主机:

把PDO连接字符串里的host=127.0.0.1改成host=pgsql(也就是你docker-compose.yml里PostgreSQL服务的名称),示例代码如下:

try {
    $dsn = sprintf(
        'pgsql:host=pgsql;port=5432;dbname=%s',
        $_ENV['POSTGRES_DB']
    );
    $pdo = new PDO(
        $dsn,
        $_ENV['POSTGRES_USER'],
        $_ENV['POSTGRES_PASSWORD']
    );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

额外验证点(可选)

如果还是有问题,可以检查以下两点:

  1. 确认PostgreSQL容器的postgresql.conf里配置了listen_addresses = '*'(默认postgres:alpine镜像已经开启了这个配置,允许容器内部监听所有地址)。
  2. 确保PHP容器的环境变量正确加载了POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB这几个值,可以在PHP容器里执行echo $POSTGRES_USER验证。

内容的提问来源于stack exchange,提问作者Chenille33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:22:41