使用Docker的Google Cloud SQL代理会拒绝连接

时间:2018-05-02 16:20:23

标签: mysql docker google-cloud-platform cloud-sql-proxy

我正在尝试使用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代理容器。

1 个答案:

答案 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,并且容器MySQLTest的给定IP分别为10.0.0.3和{{1} }。