首页 文章

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

提问于
浏览
2

我正在尝试使用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 回答

  • 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上运行 .

    Test 到达容器 MySQL 的选项是添加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.310.0.0.4 .

相关问题