拒绝docker抛出连接的google云sql代理

vc9ivgsu  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(320)

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

eqoofvh9

eqoofvh91#

这不是docker的问题,更改google云防火墙将允许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没有在容器的3306端口上运行 Test .
到达容器的选项 MySQLTest 是添加覆盖网络。


# 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 以及容器的IP地址 MySQL 以及 Test 分别是 10.0.0.3 以及 10.0.0.4 .

相关问题