我正在尝试使用cloudsql代理docker容器将应用程序(docker容器)连接到googlecloudsql数据库。因此,我用以下cloudsql代理容器创建了一个docker compose文件:(替换为我的cloudsql示例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
每当我试图从运行在同一台机器上的另一个容器(例如docker compose文件中的第二个容器)中连接到cloudsql mysql数据库时,我都会收到错误消息
错误2003(hy000):无法连接到“127.0.0.1”上的mysql服务器(111“连接被拒绝”)
我尝试用三种不同的方法连接到cloudsql代理,但仍然是相同的错误。所有容器(要连接的云sql代理和测试容器)都位于一个google计算引擎示例上:
a) mysql客户端:mysql——主机127.0.0.1
b) jdbc url:jdbc:mysql://127.0.0.1:3306/测试
c) jdbc url:jdbc:mysql://云SQL-proxy:3306/test
在我的gc防火墙中,为了测试,我打开了0.0.0.0/0的3306端口,停止并启动了cloudsql示例等,但是错误仍然存在。代理容器的日志正常:
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
我的方法有什么根本性的问题吗?还是我遗漏了什么?这可能是 Docker 的问题吗?我可以从其他容器ping代理容器。
1条答案
按热度按时间eqoofvh91#
这不是docker的问题,更改google云防火墙将允许internet上的计算机连接到示例上的3306端口。
第一个图显示容器
Test
无法访问容器mysql,因为它只知道自己(环回网络上的127.0.0.1)。您提到的错误是因为mysql没有在容器的3306端口上运行Test
.到达容器的选项
MySQL
从Test
是添加覆盖网络。如第二个图所示,这两个容器现在共享一个公共子网。容器
Test
应该能够到达集装箱MySQL
.由于容器的ip未知,因此必须使用别名(如域名)。在本例中,别名为
database
. 第二个图假设覆盖网络mysql_net
有面具255.0.0.0
以及容器的IP地址MySQL
以及Test
分别是10.0.0.3
以及10.0.0.4
.