跳至主要内容

Cloud Run:在 GCP 中部署容器化应用的指南

了解 Cloud Run 及其使用场景,然后按照我们的分步指南启动您的第一个实例。
· 9分钟 阅读

使用 AI 探索

Cloud Run 是 Google Cloud 提供的全托管无服务器平台,允许您在无需操心基础设施管理的情况下部署应用。它具有极强的灵活性,是从个人项目到企业级项目等多种场景的理想之选。

在本文中,我将为您介绍 Cloud Run 是什么、如何工作、能解决哪些使用场景,以及它与其他无服务器解决方案的比较。我还会一步步带您部署您的第一个 Cloud Run 应用!

在开始之前:如果您完全是云计算新手,建议先学习我们的 Introduction to Cloud Computing 课程。该课程会拆解云计算基础,解释诸如可扩展性与延迟等关键术语,并介绍像 GCP 这类提供商的云工具优势。

What is Cloud Run? 

Cloud Run 是一个无服务器的容器执行平台,可让您在不必担心基础设施管理的情况下部署应用程序。

在传统的基于服务器的部署中,您通常需要配置并维护虚拟机。Cloud Run 的工作方式略有不同,它将这些细节抽象掉,提供一个全托管的环境。

它基于 Knative(一个开源的 Kubernetes 平台,用于支持无服务器工作负载)构建,这意味着您的应用会根据需求自动扩缩。当流量增加时,Cloud Run 会启动更多实例来处理;当流量下降时,它会缩容,甚至可以缩到 0,这样在应用未实际运行时,您无需支付任何费用。

Cloud Run 不仅成本高效,而且非常灵活。只要能在容器中运行,您就可以部署任意语言、任意框架或二进制程序。无论是常见技术如 Node.js、Python、Go、Java,还是小众技术都可以。实际上,这意味着 Cloud Run 能为后端服务、API、AI 工作负载、Web 应用,甚至是定时批处理任务提供动力。

以上是一个概览。接下来我们更深入地看一下 Cloud Run 的关键特性。

Key Features of Cloud Run

我们刚刚提到了几个特性,下面是 Cloud Run 主要功能的完整概述。

与语言和框架无关

Cloud Run 最大的优势之一是不会将您绑定到某种特定语言或框架。只要您的应用能在容器中运行,就可以部署。如果您的团队技术栈多样,您可以在所有服务中统一使用 Cloud Run——一套工具统筹全局!

自动扩缩

Cloud Run 会根据流量进行横向、动态扩缩。当应用收到更多请求时,Cloud Run 会自动启动更多实例;当需求下降时,它会缩容,必要时甚至缩到 0。

内置安全与合规

Cloud Run 为所有已部署服务自动提供 HTTPS、由 Google 管理的服务身份用于安全认证、用于私有网络的 VPC 连接,以及内置的合规认证,如 SOC 2、ISO 27001 和 HIPAA(适用于医疗保健应用)。简单来说,安全合规方面您可以放心。

与 Google Cloud 服务集成

由于 Cloud Run 是 Google Cloud 生态的一部分,它能与其他 GCP 服务良好协作。您可以轻松将其连接到 Cloud SQL 作为数据库、使用 Pub/Sub 进行数据流处理、将文件存储在 Cloud Storage,或与 BigQuery、Firebase 以及 AI/ML 服务搭配使用。

按需 GPU 支持

对于 AI 工作负载,Cloud Run 现已支持按需 GPU。对于机器学习推理、视频处理和科学计算,这是一大提升,因为它允许您在无需管理底层硬件的情况下运行任何 GPU 加速的工作负载。

Cloud Run Functions:函数即服务(FaaS)模型

如果您不想管理完整的容器,Cloud Run Functions 提供一种简化的、事件驱动的方式来运行小型、单一用途的函数。它类似于 AWS Lambda 或 Google Cloud Functions,但运行在 Cloud Run 的基础设施之上。

How Cloud Run Works: Step-by-Step

本节我将带您将一个简单应用部署到 Cloud Run。我会引导您完成将应用容器化、部署到 Cloud Run,并根据需求自动扩缩的全过程。

我们将使用 Docker 将应用容器化,但并非必须。最后会有更多说明。

Step 1: Set up your environment

在部署任何内容之前,您需要安装以下工具:

  1. Google Cloud SDK:这是一个命令行界面(CLI),可让您与包括 Cloud Run 在内的 Google Cloud 服务交互。您可以从此处安装。
  2. Docker:如果您的应用尚未容器化,您需要使用 Docker 来打包应用。从这里安装 Docker。
  3. Google Cloud Project:请确保您已设置好一个 Google Cloud 项目。可在 Google Cloud 控制台中创建。

Step 2: Write your application code

现在,让我们编写一个简单的 “Hello World” Node.js 应用。

为您的应用创建一个目录:

mkdir hello-world-app
cd hello-world-app

在该目录下创建一个 index.js 文件,并写入以下内容:

const http = require('http');

const requestListener = (req, res) => {
    res.writeHead(200);
    res.end('Hello, Cloud Run!');
};

const server = http.createServer(requestListener);
server.listen(8080, () => {
    console.log('Server is running on port 8080');
});

创建一个 package.json 来定义应用的依赖:

{
    "name": "hello-world-app",
    "version": "1.0.0",
    "main": "index.js",
    "dependencies": {}
}

应用准备就绪后,我们将继续将其容器化。

Step 3: Containerize the application

创建 Dockerfile 以定义容器镜像

在项目目录中创建名为 “Dockerfile” 的文件,并写入以下内容:

# Use the official Node.js image as a base
FROM node:16-alpine

# Set the working directory inside the container
WORKDIR /usr/src/app

# Copy package.json and install dependencies (if any)
COPY package*.json ./

# Copy the rest of the application code
COPY . .

# Expose port 8080 for Cloud Run
EXPOSE 8080

# Start the app
CMD ["node", "index.js"]

构建 Docker 镜像

运行以下命令来构建 Docker 镜像:

docker build -t gcr.io/your-project-id/hello-world-app .

注意:将 your-project-id 替换为您的 Google Cloud 项目 ID。

本地测试镜像

您可以通过运行以下命令在本地测试 Docker 容器:

docker run -p 8080:8080 gcr.io/your-project-id/hello-world-app

在浏览器中访问 http://localhost:8080 以验证应用是否正在运行。

Step 4: Push the image to Google Artifact Registry

为您的项目启用 Artifact Registry

如果您尚未启用 Artifact Registry,请运行以下命令

gcloud services enable artifactregistry.googleapis.com

注意:您需要启用结算功能才能完成此步骤!

在 Artifact Registry 中创建存储库

在 Artifact Registry 中创建一个新的 Docker 存储库:

gcloud artifacts repositories create hello-world-repo \
--repository-format=docker \
--location=us-central1

为 Artifact Registry 配置 Docker 身份验证

配置 Docker 以使用 Artifact Registry 进行身份验证:

gcloud auth configure-docker us-central1-docker.pkg.dev

为 Artifact Registry 标记 Docker 镜像

使用 Artifact Registry 存储库 URL 为 Docker 镜像打标签:

docker tag gcr.io/your-project-id/hello-world-app us-central1-docker.pkg.dev/your-project-id/hello-world-repo/hello-world-app

将镜像推送到 Artifact Registry

将已标记的 Docker 镜像推送到您的 Artifact Registry 存储库:

docker push us-central1-docker.pkg.dev/your-project-id/hello-world-repo/hello-world-app

Step 5: Deploy to Cloud Run

当镜像推送到 Artifact Registry 后,您可以直接从 Artifact Registry 将其部署到 Cloud Run。

使用以下命令将镜像部署到 Cloud Run:

gcloud run deploy hello-world-app \
--image us-central1-docker.pkg.dev/your-project-id/hello-world-repo/hello-world-app \
--platform managed \
--region us-central1 \
--allow-unauthenticated
  • hello-world-app:这是您的 Cloud Run 服务名称。
  • us-central1-docker.pkg.dev/your-project-id/hello-world-repo/hello-world-app:存储在 Artifact Registry 中的镜像 URL。
  • --platform managed:确保使用 Cloud Run 的全托管平台(而非 GKE 集群)。
  • --region us-central1:指定 Cloud Run 部署服务的区域。
  • --allow-unauthenticated:允许公共访问服务。如需限制访问,可相应调整该标志。

运行该命令后,Cloud Run 将部署您的容器化应用,并提供用于访问的 URL。

就这样!到 GCP 控制台查看一下,您应该能看到新实例。

Step 6: Clean up

为避免持续产生费用,请在测试完成后删除服务。

1. 删除 Cloud Run 服务

运行以下命令删除已部署的 Cloud Run 服务:

gcloud run services delete hello-world-app --region us-central1

这会移除 Cloud Run 实例,但不会删除容器镜像。

2. 删除 Artifact Registry 镜像

要从 Artifact Registry 移除镜像,先列出镜像:

gcloud artifacts docker images list us-central1-docker.pkg.dev/your-project-id/hello-world-repo

然后使用以下命令删除镜像:

gcloud artifacts docker images delete us-central1-docker.pkg.dev/your-project-id/hello-world-repo/hello-world-app --delete-tags

至此,您的 Artifact Registry 也清理完成。

3. 删除 Artifact Registry 存储库(如不再需要)

如果您想彻底移除 Artifact Registry 存储库,请运行:

gcloud artifacts repositories delete hello-world-repo --location=us-central1

只有在您完全不再需要该存储库时才执行此步骤,否则可以将其复用于后续部署。

4.(可选)删除 Google Cloud 项目

如果这是一个测试项目且您已不再需要它,可以删除整个项目以移除所有相关资源:

gcloud projects delete your-project-id

Source deployments

还记得我说并不总是需要手动将应用容器化吗?

Cloud Run 现已支持源代码部署,这意味着它可以使用 Cloud Build 从您的源代码为您构建容器。

您可以使用以下命令:

gcloud run deploy hello-world-app \
--source . \
--region us-central1 \
--allow-unauthenticated

Cloud Build 会自动检测您的应用语言(Node.js、Python、Go、Java 等),为您构建容器镜像并存储到 Artifact Registry。随后 Cloud Run 会像您手动创建容器一样部署该镜像。对于使用受支持语言的简单应用(如 Node.js、Python、Go、Java 等),我强烈建议使用这种方式,但如果您需要对容器进行完全控制(例如自定义依赖、操作系统级调整、多步构建),则不建议使用。

Tips to Use Cloud Run efficiently

将应用部署到 Cloud Run 相当简单,但要让它高效运行则需要进行一些微调。我在最初使用时经历了不少试错,以下是我的经验:

1. 冷启动确实存在

尤其当您的容器镜像较大时更明显。镜像越小,服务启动越快。使用 distroless 等精简基础镜像能显著改善。如果您构建的是 Python 应用,试试官方镜像的 slim 版本。或者,如果您对成本不太敏感,可以将最小实例数设置为 1。

2. 最值得调优的变量是请求并发数

Cloud Run 允许每个实例同时处理多个请求,但默认值(每个容器 80 个请求)往往并不最优。对于 CPU 密集型任务,我发现将并发数降至 1 或 2 会顺畅得多。相反,API 通常可以承受更高的并发。并发数越高,所需的实例数量就越少,因而成本也越低,所以务必多做实验,找出您的应用的最佳平衡点。

3. 一定要设置实例上限!

当有人(比如我)做压测并发起一堆请求时,这非常有用。我已经踩过这个坑了,您就别再踩了。请务必设置最大实例数。

4. 确保只有合适的人能访问您的实例

默认情况下,任何拥有 URL 的人都可以访问 Cloud Run 服务,这对于快速演示很棒,但对于生产环境则未必合适。如果您的应用不该公开访问,请使用 IAM 权限进行加固。

5. Cloud Logging 和 Cloud Trace 会成为您的好伙伴

如果您习惯通过 SSH 登录虚拟机来调试问题,那这次可能会失望。Cloud Run 的日志会直接流向 Google Cloud 控制台,您可以在那儿查看一切。请确保为应用添加结构化日志,这会让排障变得容易得多。

Cloud Run Use Cases

我们已经谈到过一些 Cloud Run 的使用场景,比如运行 Web 应用、API 或定时任务,但显然还有更多。

视频与图像分析

您可以部署图像识别模型,为社交媒体平台实时处理上传的图片,或在视频上传时进行转码。当内容走红、需求激增时,Cloud Run 能通过自动扩缩应对峰值;而在需求较低时,仍能确保成本效率。

视频与图像分析

来源:Google Cloud

实时流处理

想象您在构建一个监控在线市场用户行为的系统。通过处理来自 Pub/Sub 或 BigQuery 的事件流,您可以基于用户行为即时触发操作,如发送推送通知或实时分析趋势。Cloud Run 会在高峰期自动扩容以处理传入事件,在流量减少时缩容。

实时流处理

来源:Google Cloud

实时文件处理

一个场景是在大型企业中进行实时日志文件分析。每当日志文件上传到 Cloud Storage,Cloud Run 就会触发一个容器来解析文件、运行分析并存储结果,同时还能根据文件大小和处理任务的复杂度动态扩缩。

实时文件处理

来源:Google Cloud

无服务器 IoT 后端

Cloud Run 非常适合处理 IoT 应用的后端服务。例如,在一个从数千个传感器采集环境数据的 IoT 方案中,Cloud Run 可以实时处理来自各设备的输入数据。

无服务器 IoT 后端

来源:Google Cloud

Google Cloud Run 定价 

Cloud Run 采用按需付费模式,这意味着只有在应用实际运行时消耗的计算资源才会计费。当您的应用未处理请求时,它可以缩容至 0,从而避免不必要的成本。

定价拆解

截至 2025 年 3 月,Cloud Run 的收费主要基于两个因素:

资源费用免费额度
CPU$0.000018 每 vCPU-秒240,000 vCPU-秒/月
内存$0.000002 每 GiB-秒450,000 GiB-秒/月

上述定价适用于基于实例的计费,但在基于请求的计费下工作方式有所不同。不同区域的价格与免费额度也略有差异,请查阅Google Cloud 官方页面获取准确数字。页面还提供价格计算器帮助您核算成本,并提供承诺使用折扣。

小提示:与同一区域内的其他 Google Cloud 服务之间的流量是免费的,因此在进行数据交换时,尽量使用 Cloud Storage、Cloud SQL 或 Pub/Sub,而非外部服务。

Cloud Run 与 Cloud Run Functions 的比较 

Google 提供两种无服务器计算选项:Cloud Run 和 Cloud Run Functions(此前称为 Cloud Functions)。两者都能让您在无需管理基础设施的情况下运行代码,但还是略有不同。

特性Cloud RunCloud Functions
执行模型运行完整的容器化应用运行独立函数(FaaS 模型)
运行时控制任意语言、任意框架、自定义二进制预定义运行时(Node.js、Python、Go 等)
状态无状态,但可在一次请求内维持连接无状态,面向事件驱动工作负载
伸缩按容器实例扩缩按函数调用扩缩
触发方式HTTP 请求、Pub/Sub、事件驱动事件驱动(Pub/Sub、Cloud Storage、HTTP 等)
冷启动可通过预热实例将其降至最小扩容时可能有明显延迟
最佳适用API、微服务、后端服务、AI 工作负载轻量的事件驱动函数、自动化

何时使用 Cloud Run

  • ✅ 您需要对运行时和依赖进行完全控制。
  • ✅ 您在运行处理持续请求的 Web 服务、API 或微服务。
  • ✅ 您希望以最小改动部署现有的容器化应用。
  • ✅ 您需要后台处理或长时间运行的任务(如 AI 推理、批处理作业)。

何时使用 Cloud Run Functions

  • ✅ 您需要简单的事件驱动函数,可在 Pub/Sub 消息或 Cloud Storage 上传等事件上触发。
  • ✅ 您在处理短时操作,如发送通知、处理小型任务或进行数据转换。
  • ✅ 您不想管理容器,更偏好为 JavaScript、Python、Go 等提供的预构建运行时。

两者并不一定非此即彼,您也可以组合使用!例如,您的 Cloud Run 后端可以触发 Cloud Run Functions 来异步处理发送邮件或图像处理等特定任务。

与其他 Google Cloud 服务的比较

我们已经对 Cloud Run 与 Cloud Run Functions 做了相当深入的比较,但还有另外两个值得一提的 Google Cloud 服务:GKE 和 App Engine。

特性Cloud RunGoogle Kubernetes Engine (GKE)App Engine
管理类型全托管无服务器自管的 Kubernetes 集群全托管的平台即服务
伸缩自动扩缩,可缩至 0通过 Kubernetes 手动或自动扩缩自动扩缩(但不能缩至 0)
部署部署容器(任意语言)通过 Kubernetes 部署容器部署代码(支持特定运行时)
使用场景API、微服务、Web 应用、批处理作业、AI复杂应用、大规模微服务、ML 工作负载Web 应用、移动后端、API
支持语言任意(基于容器)任意(基于容器)支持特定运行时

显然其中还有更多细微差别,但简而言之:如果您需要全托管、容器化、自动扩缩且灵活的方案,选 Cloud Run。如果您要以最小配置构建 Web 应用,选 App Engine。而如果您需要对 Kubernetes 集群进行全面控制以构建大规模、复杂应用,则选择 GKE。

Conclusion

现在您已经全面了解 Cloud Run,不妨尝试启动您的第一个实例,或查看其他 Google Cloud 服务,找到最适合您的控制与自动化程度!

Cloud Run 常见问题

如何在 Cloud Run 中处理数据库连接?

您可以使用 Cloud SQL Auth Proxy、启用连接池(例如 PostgreSQL 的 PgBouncer),或使用 Firestore 等无服务器数据库以避免连接数限制。

Cloud Run 可以使用自定义域名吗?

可以。在 Cloud Run 控制台的“管理自定义域名”中进行设置,验证所有权并更新 DNS 记录。SSL 会自动提供。

Cloud Run 支持 WebSocket 和长连接吗?

可以,但实例在空闲时可能会关闭。要维持连接,可设置最小实例数,或使用 Pub/Sub 进行事件驱动通信。

Cloud Run 能处理后台任务吗?

并不直接支持,因为它基于请求模型。请使用 Cloud Tasks、Pub/Sub 或 Workflows 来触发并管理后台处理。

我可以在 Cloud Run 上运行有状态应用吗?

不推荐,因为实例是无状态的。请使用 Cloud Storage、Firestore 或外部数据库来持久化状态。

Marie Fayard

作者

Marie Fayard

我是一名具有产品思维的技术负责人,专注于帮助早期初创公司从首个原型成长到实现产品与市场匹配,并持续向前发展。我对人们如何使用技术充满好奇,热爱与创始人及跨职能团队紧密合作,将大胆的想法变为现实。不在打造产品的时候,我会在世界的新角落寻找灵感,或在瑜伽馆放松减压。

主题