有没有办法通过 docker 容器内的代理访问 google 云 SQL
Is there a way to access google cloud SQL via proxy inside docker container
我在托管 Django 服务器的 Google 计算引擎上有多个 docker 机器(开发、暂存)运行(这需要访问 Google 云 SQL 访问)。我有多个 Google Cloud SQL 实例 运行,每个实例都由我的 Google Compute Engine 实例上的相应 docker 机器使用。
目前我正在通过将我的计算引擎 IP 列入白名单来访问云 SQL。但是出于明显的原因我不想使用 IP,即我不为我的开发机器使用静态 IP。
但是现在想用google_cloud_proxy的方式来获取权限。但是我该怎么做! GCP 提供了多种访问 google Cloud SQL 实例的方法。但是 none 适合我的用例:
我有这个选项https://cloud.google.com/sql/docs/mysql/connect-compute-engine;但是这个
- 只允许我的计算机引擎访问 SQL 实例;我必须从我的 Docker.
访问
- 这不支持我在同一台计算引擎机器上代理多个 SQL 实例;如果可能的话,我希望在 docker 中做这个代理。
那么,我如何才能访问 Docker 中的云 SQL?如果 docker compose 是更好的开始方式;为 kubernetes 实施有多容易(我使用 google 容器引擎进行生产)
我能够通过 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
您可以在此处参考 Google 文档:
https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#connecting-docker
这将向您展示如何 运行 容器上的代理。然后你可以使用 docker-compose 按照 @Dan 在这里建议的答案:
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
我在托管 Django 服务器的 Google 计算引擎上有多个 docker 机器(开发、暂存)运行(这需要访问 Google 云 SQL 访问)。我有多个 Google Cloud SQL 实例 运行,每个实例都由我的 Google Compute Engine 实例上的相应 docker 机器使用。
目前我正在通过将我的计算引擎 IP 列入白名单来访问云 SQL。但是出于明显的原因我不想使用 IP,即我不为我的开发机器使用静态 IP。
但是现在想用google_cloud_proxy的方式来获取权限。但是我该怎么做! GCP 提供了多种访问 google Cloud SQL 实例的方法。但是 none 适合我的用例:
我有这个选项https://cloud.google.com/sql/docs/mysql/connect-compute-engine;但是这个
- 只允许我的计算机引擎访问 SQL 实例;我必须从我的 Docker. 访问
- 这不支持我在同一台计算引擎机器上代理多个 SQL 实例;如果可能的话,我希望在 docker 中做这个代理。
那么,我如何才能访问 Docker 中的云 SQL?如果 docker compose 是更好的开始方式;为 kubernetes 实施有多容易(我使用 google 容器引擎进行生产)
我能够通过 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
您可以在此处参考 Google 文档: https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#connecting-docker
这将向您展示如何 运行 容器上的代理。然后你可以使用 docker-compose 按照 @Dan 在这里建议的答案:
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