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客户端直接测试代理连通性,排除代理本身问题:
如果本地能连接,说明代理正常,问题仅存在于CakePHP容器的网络配置。mysql -h 127.0.0.1 -P 3306 -u myusername -p mydatabasename
内容的提问来源于stack exchange,提问作者Me JW Crouch
相关产品推荐
相关产品推荐

