我正在尝试使用cloudsql-proxy docker容器将应用程序(docker容器)连接到Google Cloud SQL数据库 . 因此,我用以下的cloudsql-proxy容器创建了一个docker-compose文件:( XXX替换为我的cloud sql实例id)
version: "3"
volumes:
sqlproxy:
services:
cloudsql-proxy:
container_name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: /cloud_sql_proxy --dir=/cloudsql -instances=XXX=tcp:0.0.0.0:3306 -credential_file=/config/credentials.json
ports:
- "3306:3306"
volumes:
- /usr/share/service-accounts/cloudsql-client.json:/config/credentials.json
- sqlproxy:/cloudsql
- /etc/ssl/certs:/etc/ssl/certs
restart: always
每当我尝试从同一台机器上运行的另一个容器内连接到cloudsql mysql数据库时,例如在docker-compose文件中的第二个容器,我收到错误
"ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")"
我试图用三种不同的方法连接到cloudsql-proxy,但仍然是同样的错误 . 所有容器( Cloud sql代理和要连接的测试容器)都在一个谷歌计算引擎实例上:
a)mysql-client:mysql --host 127.0.0.1
b)jdbc url:jdbc:mysql://127.0.0.1:3306 / test
c)jdbc url:jdbc:mysql:// cloudsql-proxy:3306 / test
在我的gc防火墙内,为了测试目的,我打开了端口3306 for 0.0.0.0/0,停止并启动了 Cloud sql实例等但错误仍然存在 . 代理容器的日志没问题:
2018/05/02 16:02:03 using credential file for authentication; email=cloudsql-client@xxx.iam.gserviceaccount.com
2018/05/02 16:02:03 Listening on 0.0.0.0:3306 for x:x:x
2018/05/02 16:02:03 Ready for new connections
我的方法有什么根本性的错误,或者我错过了什么?这可能是一个码头 Worker 的问题吗?我可以从其他容器ping代理容器 .
1 回答
这不是Docker问题,更改Google Cloud防火墙将允许Internet上的计算机连接到该实例上的端口3306 .
第一个图显示容器
Test
无法访问容器MySQL,因为它只知道自身(环回网络上的127.0.0.1) . 你提到的错误发生是因为MySQL没有在容器Test
上的端口3306上运行 .从
Test
到达容器MySQL
的选项是添加overlay network .如第二张图所示,这两个容器现在共享一个共同的子网 . 容器
Test
应该能够到达容器MySQL
.由于容器的IP未知,您必须使用别名(如域名) . 在该示例中,别名是
database
. 第二个图假设覆盖网络mysql_net
具有掩码255.0.0.0
,并且容器MySQL
和Test
的给定IP分别是10.0.0.3
和10.0.0.4
.