我正在尝试使用cloudsql-proxy docker容器将应用程序(docker容器)连接到Google Cloud SQL数据库。因此,我使用以下cloudsql-proxy容器创建了一个docker-compose文件: (XXX替换为我的云sql实例ID)
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
每当我尝试从同一台机器上运行的另一个容器内连接到cloudql mysql数据库时,例如docker-compose文件中的第二个容器,我收到错误
“ERROR 2003(HY000):无法连接到'127.0.0.1'上的MySQL服务器(111”拒绝连接“)”
我尝试使用三种不同的方法连接到cloudsql-proxy,但仍然是同样的错误。所有容器(云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,停止并启动了云sql实例等,但错误仍然存在。代理容器的日志没问题:
我的做法有什么根本性的错误,还是我错过了什么?这可能是码头工人的问题吗?我可以从其他容器ping代理容器。
答案 0 :(得分:0)
这不是Docker问题,更改Google Cloud防火墙将允许Internet上的计算机连接到实例上的端口3306。
Figure 1
+--------------------------------------------+
| GCE instance |
| |
| +-----------------+ +-----------------+ |
| |MySQL 127.0.0.1| |Test 127.0.0.1| |
| | | | | |
| +------3306-------+ +-----------------+ |
| | |
| | |
+--------3306--------------------------------+
第一个数字显示容器Test
不能到达容器MySQL,因为它只知道自身(在环回网络上为127.0.0.1)。您提到的错误是因为MySQL未在容器Test
的端口3306上运行。
从MySQL
到达容器Test
的一种选择是添加一个overlay network。
# I recommend using the latest version
version: "3.6"
volumes:
sqlproxy:
networks:
mysql_net:
driver: overlay
services:
cloudsql-proxy:
...
# This is not required
# ports:
# - "3306:3306"
...
networks:
mysql_net:
aliases:
database
test-container:
# Reach the container MySQL using the alias
command: mysql -u <user> -p --host database
...
networks:
mysql_net:
如第二幅图所示,这两个容器现在共享一个公共子网。容器Test
应该能够到达容器MySQL
。
Figure 2
+-----------------------------------------------------------+
| GCE instance |
| |
| +-------------------------------+ +-------------------+ |
| MySQL 127.0.0.1 | |Test 127.0.0.1 | |
| | 10.0.0.3/8 (database)| | 10.0.0.4/8| |
| | | | | |
| | | | | |
| +------------3306---------------+ +-------------------+ |
| |
+-----------------------------------------------------------+
由于容器的IP是未知的,因此必须使用别名(例如域名)。在示例中,别名为database
。第二个图假定覆盖网络mysql_net
具有掩码255.0.0.0
,并且容器MySQL
和Test
的给定IP分别为10.0.0.3
和{{1} }。