有没有办法通过docker容器内的代理访问谷歌云SQL

Posted

技术标签:

【中文标题】有没有办法通过docker容器内的代理访问谷歌云SQL【英文标题】:Is there a way to access google cloud SQL via proxy inside docker container 【发布时间】:2018-01-31 20:57:26 【问题描述】:

我在托管 Django 服务器的 Google Compute Engine 上运行了多个 docker 机器(dev、staging)(这需要访问 Google Cloud SQL 访问权限)。我有多个 Google Cloud SQL 实例正在运行,每个实例都由我的 Google Compute Engine 实例上的相应 docker 机器使用。

目前我通过将我的计算引擎 IP 列入白名单来访问 Cloud SQL。但出于明显的原因,我不想使用 IP,即我的开发机器不使用静态 IP。

但现在想使用 google_cloud_proxy 的方式来获得访问权限。但我该怎么做! GCP 提供了多种访问 google Cloud SQL 实例的方法。但它们都不适合我的用例:

我有这个选项https://cloud.google.com/sql/docs/mysql/connect-compute-engine;但是这个

    只允许我的计算机引擎访问 SQL 实例;我必须从我的 Docker 访问。 这不支持我在同一台计算引擎机器上代理多个 SQL 实例;如果可能的话,我希望在 docker 内做这个代理。

那么,我如何访问 Docker 中的 CLoud SQL 呢?如果 docker compose 是更好的开始方式; Kubernetes 实现起来有多容易(我使用 google 容器引擎进行生产)

【问题讨论】:

单个 Cloud SQL 代理可以代理多个实例。您需要多个代理的原因是什么? 我读了一些东西,意识到你说的是真的。所以我的第二个问题现在无效.. 你对 Q1 有什么想法吗.. 我如何在单个 docker 中访问这个代理连接 我不确定我是否完全理解这个问题。您可以将代理作为单独的 docker 镜像 (cloud.google.com/sql/docs/mysql/connect-docker) 运行,然后从您的 docker 镜像连接到它。 根据您的回答。我可以看到你理解我的问题。 Connect-docker 是我在我的问题中使用 docker-compose 的意思。我看到 docker compose 是选项。但我只是在探索这是否是最好的选择。 如果您使用静态 IP 从 GCE 实例连接,您可以选择将这些 IP 列入白名单并直接通过 IP 连接。如果您不想维护 IP 白名单,那么使用代理 docker 容器是您的最佳选择。 【参考方案1】:

通过使用 docker-compose,我能够弄清楚如何在本地 docker 环境中使用 cloudsql-proxy。您需要下载 Cloud SQL 实例凭据并准备好它们。我将它们作为credentials.json 保存在我的项目根目录中,并将其添加到我的.gitignore 项目中。

我发现的关键部分是在 GCP 实例 ID 之后使用 =tcp:0.0.0.0:5432 以便可以转发端口。然后,在您的应用程序中,使用cloudsql-proxy 而不是localhost 作为主机名。确保您的其余数据库凭据在您的应用程序机密中有效,以便它可以通过 cloudsql-proxy 容器提供的本地代理进行连接。

注意:请记住,我正在编写一个 tomcat Java 应用程序,而我的 docker-compose.yml 反映了这一点。

docker-compose.yml:

version: '3'
services:
  cloudsql-proxy:
      container_name: cloudsql-proxy
      image: gcr.io/cloudsql-docker/gce-proxy:1.11
      command: /cloud_sql_proxy --dir=/cloudsql -instances=<YOUR INSTANCE ID HERE>=tcp:0.0.0.0:5432 -credential_file=/secrets/cloudsql/credentials.json
      ports:
        - 5432:5432
      volumes:
        - ./credentials.json:/secrets/cloudsql/credentials.json
      restart: always

  tomcatapp-api:
    container_name: tomcatapp-api
    build: .
    volumes:
      - ./build/libs:/usr/local/tomcat/webapps
    ports:
      - 8080:8080
      - 8000:8000
    env_file:
      - ./secrets.env
    restart: always

【讨论】:

有趣,谢谢 Dan,我们使用了类似的方法 :) 感谢您发布您的答案 我能知道为什么restart: alwayscloudsql-proxy 吗? 我想通过这样的 docker-compose.yml 在 GCE 上运行。但是,我的应用无法连接到cloudsql-proxy。它返回gaierror: [Errno -2] Name or service not known。你知道怎么解决吗? 3x 你不能只通过'cloudsql-proxy'而不是'0.0.0.0'连接吗? 花了 2 天时间调试,这是截至 2021 年 8 月的正确答案【参考方案2】:

您可以在此处参考 Google 文档: https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#connecting-docker

这将向您展示如何在容器上运行代理。然后您可以按照@Dan 在这里建议的答案使用 docker-compose:https://***.com/a/48431559/14305096

 docker run -d \
      -v PATH_TO_KEY_FILE:/config \
      -p 127.0.0.1:5432:5432 \
      gcr.io/cloudsql-docker/gce-proxy:1.19.1 /cloud_sql_proxy \
      -instances=INSTANCE_CONNECTION_NAME=tcp:0.0.0.0:5432 \
      -credential_file=/config

【讨论】:

以上是关于有没有办法通过docker容器内的代理访问谷歌云SQL的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize.authenticate() 对 Docker 内的谷歌云 sql 连接不起作用(没有成功或错误响应)

谷歌云运行容器网络

如何在谷歌云存储中启用实时对象访问分析?

谷歌云防火墙暴露端口 Docker

有没有办法修改谷歌云任务设置?

通过 mosquitto 代理发布到谷歌云中的不同 pubsub 主题?