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

CakePHP容器连接Google SQL Proxy容器失败求助

问题详情

代理容器状态

代理已配置凭据并正常启动,日志如下:

2025-01-29 12:31:44 2025/01/29 18:31:44 Authorizing with the credentials file at "/path/to/service-account-key.json"
2025-01-29 12:31:44 2025/01/29 18:31:44 [project-name:us-central1:instance-name] Listening on [::]:5432
2025-01-29 12:31:44 2025/01/29 18:31:44 The proxy has started successfully and is ready for new connections!

CakePHP数据库配置(app.php)

'Datasources' => [
        'default' => [
            'className' => Connection::class,
            'driver' => Mysql::class,
            'persistent' => false,
            'host' => '[::]:5432', // 已尝试过 'localhost:5432'
            'username' => 'myusername',
            'password' => 'mypassword',
            'database' => 'mydatabasename',
            'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
            'flags' => [],
            'log' => false,
            'quoteIdentifiers' => false,
        ]

代理容器启动命令

docker run -d -v F:\local\path\to\service-account-key.json:/path/to/service-account-key.json -p 127.0.0.1:5432:5432 gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.3 --address 0.0.0.0 --port 5432 --credentials-file /path/to/service-account-key.json project-name:us-central1:instance-name

错误信息

Database CakePHP is NOT able to connect to the database.
Connection to Mysql could not be established: SQLSTATE[HY000] [2002] Connection refused

代理容器未记录任何连接尝试,直接访问localhost:5432时容器会接受连接,但返回无效响应(非HTTP请求)。


解决方案

1. 修复Docker网络连通性

CakePHP容器和代理容器默认不在同一Docker网络,无法通过localhost或[::]互相访问:

  • 新建专用Docker网络:
    docker network create cloud-sql-network
    
  • 启动代理容器时加入该网络,同时给容器命名方便访问:
    docker run -d --name cloud-sql-proxy --network cloud-sql-network -v F:\local\path\to\service-account-key.json:/path/to/service-account-key.json -p 127.0.0.1:5432:5432 gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.3 --address 0.0.0.0 --port 5432 --credentials-file /path/to/service-account-key.json project-name:us-central1:instance-name
    
  • 启动CakePHP容器时也加入同一网络:
    docker run --network cloud-sql-network [你的CakePHP容器启动命令]
    
  • 修改CakePHP的host配置为代理容器名称:cloud-sql-proxy:5432

2. 修正端口与数据库驱动不匹配问题

Cloud SQL的MySQL默认端口为3306,你当前代理监听的5432是PostgreSQL默认端口,驱动与端口不匹配会导致连接失败:

  • 调整代理启动命令的端口为3306:
    docker run -d --name cloud-sql-proxy --network cloud-sql-network -v F:\local\path\to\service-account-key.json:/path/to/service-account-key.json -p 127.0.0.1:3306:3306 gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.3 --address 0.0.0.0 --port 3306 --credentials-file /path/to/service-account-key.json project-name:us-central1:instance-name
    
  • 同步修改CakePHP的host配置为:cloud-sql-proxy:3306

3. 验证代理与数据库权限

  • 确认所用服务账号已分配Cloud SQL Client角色,拥有访问目标Cloud SQL实例的权限
  • 用本地MySQL客户端直接测试代理连通性,排除代理本身问题:
    mysql -h 127.0.0.1 -P 3306 -u myusername -p mydatabasename
    
    如果本地能连接,说明代理正常,问题仅存在于CakePHP容器的网络配置。

内容的提问来源于stack exchange,提问作者Me JW Crouch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:03:17