1. 简介

在诸如 Google Cloud Run 这样的无服务器(Serverless)环境中部署应用,具备良好的可扩展性和管理便利性。

在本教程中,我们将介绍如何从 Docker Hub 拉取镜像并部署到 Google Cloud Run。为了说明问题,我们以 PostgreSQL 的流行管理工具 pgAdmin 为例进行演示。


2. 前提条件

在开始部署流程之前,请确保满足以下前提条件:

满足上述条件后,即可开始后续操作。


3. 从 Docker Hub 拉取镜像并部署

首先,我们需要将目标镜像从 Docker Hub 拉取到本地系统。

3.1 从 Docker Hub 拉取镜像

以 pgAdmin 为例,使用以下命令拉取官方镜像:

$ docker pull dpage/pgadmin4
Using default tag: latest
latest: Pulling from dpage/pgadmin4
43c4264eed91: Pull complete
...
Digest: sha256:585350593e8b0483941fa9a2d5ebb04b88a66e83a7b5603c169f9446b271312f
Status: Downloaded newer image for dpage/pgadmin4:latest
docker.io/dpage/pgadmin4:latest

该命令从 Docker Hub 获取最新的 pgAdmin 镜像,确保部署使用的是最新版本和功能。镜像成功拉取后,会存储在本地,可通过 docker image 命令验证。

3.2 为 Google Container Registry 标记镜像

下一步是为镜像打标签,以便上传到 Google Container Registry (GCR)。使用项目 ID 标记镜像:

$ docker tag dpage/pgadmin4 gcr.io/nifty-bird-432210-q8/pgadmin4

该命令为现有镜像创建新标签。其中 gcr.io/nifty-bird-432210-q8/pgadmin4 是目标标签,nifty-bird-432210-q8 是你的 GCP 项目 ID。

⚠️ 注意:打标签有助于 Docker 在推送镜像到 GCR 时识别正确的目标地址,为后续部署做好准备。

3.3 与 Google Cloud 认证

在推送镜像到 GCR 之前,需要先登录 Google Cloud:

$ gcloud auth login
Your browser has been opened to visit:
...
You are now logged in as [user@example.com].
Your current project is [nifty-bird-432210-q8]. You can change this setting by running:
  $ gcloud config set project PROJECT_ID

然后设置当前项目:

$ gcloud config set project nifty-bird-432210-q8 
Updated property [core/project].

接下来配置 Docker 使用 gcloud 凭据:

$ gcloud auth configure-docker
...
{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    ...
  }
}
Adding credentials for all GCR repositories.
...

此时,gcloud 已认证,当前项目已设置,Docker 也已准备好与 GCP 服务通信。

3.4 推送镜像至 Google Container Registry

完成标签和认证配置后,推送镜像到 GCR:

$ docker push gcr.io/nifty-bird-432210-q8/pgadmin4
Using default tag: latest
The push refers to repository [gcr.io/nifty-bird-432210-q8/pgadmin4]
03ff70d2b32a: Layer already exists 
4022158531c6: Layer already exists 
... 
latest: digest: sha256:89f0402040f7fac463a5479636c1a7556dae867440549ff02bef9cfeab8e6be4 size: 3666

该命令将镜像上传至 GCR,路径为 gcr.io/nifty-bird-432210-q8/pgadmin4

⚠️ 注意:推送时间取决于镜像大小和网络速度。

3.5 在 Google Cloud Run 上部署 pgAdmin

最后,使用 gcloud 命令部署 pgAdmin 到 Cloud Run:

$ gcloud run deploy pgadmin \
  --image=gcr.io/nifty-bird-432210-q8/pgadmin4 \
  --platform=managed \
  --region=us-central1 \
  --allow-unauthenticated \
  --set-env-vars "PGADMIN_DEFAULT_EMAIL=admin@example.com,PGADMIN_DEFAULT_PASSWORD=yourpassword" \
  --port=80

Deploying container to Cloud Run service [pgadmin] in project [nifty-bird-432210-q8] region [us-central1]
✓ Deploying new service... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [pgadmin] revision [pgadmin-00001-xsr] has been deployed and is serving 100 percent of traffic.
Service URL: https://pgadmin-534149333305.us-central1.run.app

命令参数说明如下:

  • --image: 指定部署的容器镜像
  • --platform=managed: 使用托管的 Cloud Run 服务
  • --region: 部署区域
  • --allow-unauthenticated: 允许匿名访问
  • --set-env-vars: 设置容器环境变量(pgAdmin 登录邮箱和密码)
  • --port: 容器监听端口

✅ 成功部署后,Cloud Run 会返回一个访问地址,如:https://pgadmin-534149333305.us-central1.run.app


4. 使用 Cloud Build 部署

除了上述方法,还可以使用 Google Cloud Build 自动化构建和部署过程,无需本地执行 Docker 命令。

4.1 创建 Cloud Build 配置文件

创建名为 cloudbuild.yaml 的文件,内容如下:

steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['pull', 'dpage/pgadmin4']

  - name: 'gcr.io/cloud-builders/docker'
    args: ['tag', 'dpage/pgadmin4', 'gcr.io/nifty-bird-432210-q8/pgadmin4']

  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/nifty-bird-432210-q8/pgadmin4']

  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        gcloud run deploy pgadmin \
        --image=gcr.io/nifty-bird-432210-q8/pgadmin4 \
        --platform=managed \
        --region=us-central1 \
        --allow-unauthenticated \
        --set-env-vars "PGADMIN_DEFAULT_EMAIL=admin@example.com,PGADMIN_DEFAULT_PASSWORD=yourpassword" \
        --port=80

timeout: 900s

该配置文件定义了四步操作:拉取、标记、推送镜像,以及最终部署到 Cloud Run。

4.2 授予 Cloud Build 服务账号权限

需要为默认服务账号添加权限,使其能够访问 Cloud Build 资源:

$ gcloud projects add-iam-policy-binding nifty-bird-432210-q8 \
  --member="serviceAccount:123456789012-compute@developer.gserviceaccount.com" \
  --role="roles/storage.admin"

4.3 提交构建任务

提交构建任务并触发部署流程:

$ gcloud builds submit --config cloudbuild.yaml
...
Step #3:   Setting IAM policy failed, try "gcloud beta run services add-iam-policy-binding --region=us-central1 --member=allUsers --role=roles/run.invoker pgadmin"
Step #3: Service [pgadmin] revision [pgadmin-00002-4rb] has been deployed and is serving 100 percent of traffic.
Step #3: Service URL: https://pgadmin-534149333305.us-central1.run.app
Finished Step #3
PUSH
DONE
...

该命令上传 cloudbuild.yaml 文件并触发构建流程。构建完成后,pgAdmin 服务将部署到 Cloud Run。


5. 总结

本文介绍了如何从 Docker Hub 拉取镜像并部署到 Google Cloud Run。通过使用 Cloud Run 和 Cloud Build,整个流程变得更加顺畅且具备良好的可扩展性。

这种部署方式让我们可以专注于应用本身,而将基础设施管理交由 Google Cloud 处理。


原始标题:Pulling Docker Hub Images in GCP Cloud Run