概览

Cloud Run 是一个托管式计算平台,供您运行可通过 HTTP 请求调用的无状态容器。Cloud Run 采用无服务器设计:您不用管理基础设施,因此可全力专注于最重要的工作,即构建出色的应用。
Cloud Run 基于 Knative 构建而成,可让您选择使用 Cloud Run 在全托管式环境中运行容器,或使用 Cloud Run on GKE 在您的 Google Kubernetes Engine 集群中运行容器。
本实验的目标是构建一个简单的容器化应用映像并将其部署到 Cloud Run。
目标
在本实验中,您将学习如何完成以下操作:
- 启用 Cloud Run API。
- 创建一个能够部署为无服务器、无状态容器的简单 Node.js 应用。
- 将您的应用容器化并上传到 Artifact Registry。
- 在 Cloud Run 上部署容器化应用。
- 删除不需要的映像,以免产生额外的存储费用。
设置和要求
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。
激活 Google Cloud Shell
Google Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。
Google Cloud Shell 提供了可用于访问您的 Google Cloud 资源的命令行工具。
-
在 Cloud 控制台右上角的工具栏中,点击“打开 Cloud Shell”按钮。

-
点击继续。
预配并连接到环境需要一些时间。如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 PROJECT_ID。例如:

gcloud 是 Google Cloud 的命令行工具。它会预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。
gcloud auth list
输出:
Credentialed accounts:
- @.com (active)
输出示例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
gcloud config list project
输出:
[core]
project =
输出示例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注意:有关 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
参考信息
基本的 Linux 命令
下面是一些非常基本的 Linux 命令的参考列表,这些命令可能包含在本实验的说明或代码块中。
命令 --> |
操作 |
. |
命令 --> |
操作 |
mkdir(创建目录) |
新建文件夹 |
. |
cd(更改目录) |
转入另一文件夹 |
ls(列出) |
列出目录中的文件和文件夹 |
. |
cat(串联) |
在不使用编辑器的情况下读取文件的内容 |
apt-get update |
更新软件包管理器库 |
. |
ping |
用于测试主机可达性的信号 |
mv(移动) |
移动文件 |
. |
cp(复制) |
创建文件副本 |
pwd(当前工作目录) |
返回您当前所在的位置 |
. |
sudo(超级用户的操作) |
授予更高的管理员权限 |
任务 1. 启用 Cloud Run API 并配置 shell 环境
- 在 Cloud Shell 中,启用 Cloud Run API:
gcloud services enable run.googleapis.com
- 如果系统提示您授权使用凭据,请进行相应授权。之后,您应该会看到如下所示的消息,指出授权成功:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
注意:您也可以使用控制台的 API 和服务部分来启用 API。
- 设置计算区域:
gcloud config set compute/region {{{project_0.default_region | "REGION"}}}
- 创建一个 LOCATION 环境变量:
LOCATION="{{{project_0.default_region | Region}}}"
任务 2. 编写示例应用
在此任务中,您将构建一个基于 Express 的简单 NodeJS 应用来响应 HTTP 请求。
- 在 Cloud Shell 中,创建一个名为
helloworld
的新目录,然后切换到该目录:
mkdir helloworld && cd helloworld
-
接下来,您需要创建并编辑一些文件。如需修改文件,您可以使用 nano
;也可以在 Cloud Shell 中点击打开编辑器按钮来使用 Cloud Shell 的代码编辑器。
-
创建一个 package.json
文件,然后向该文件添加以下内容:
nano package.json
{
"name": "helloworld",
"description": "Simple hello world sample in Node",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "Google LLC",
"license": "Apache-2.0",
"dependencies": {
"express": "^4.17.1"
}
}
请务必注意,上面的文件包含一个 start 脚本命令和一个 Express Web 应用框架依赖项。
-
按下 CTRL+X 键,然后依次按 Y 键和 Enter 键以保存 package.json
文件。
-
接下来,在同一目录中创建 index.js
文件,并将下面的代码复制到该文件中:
nano index.js
const express = require('express');
const app = express();
const port = process.env.PORT || 8080;
app.get('/', (req, res) => {
const name = process.env.NAME || 'World';
res.send(`Hello ${name}!`);
});
app.listen(port, () => {
console.log(`helloworld: listening on port ${port}`);
});
这段代码会创建一个基本 Web 服务器,监听由 PORT
环境变量定义的端口。您的应用现已编写完毕,可以将其容器化并上传到 Artifact Registry。
- 按下 CTRL+X 键,然后依次按 Y 键和 Enter 键以保存
index.js
文件
注意:您也可以使用诸多其他编程语言来探索如何开始使用 Cloud Run。您可以在快速入门指南中找到关于 Go、Python、Java、PHP、Ruby 和 Shell 脚本等的说明。
任务 3. 容器化该应用并将其上传到 Artifact Registry
- 如需将示例应用容器化,请在源文件所在的目录中创建一个名为
Dockerfile
的新文件,并向该文件添加以下内容:
nano Dockerfile
# 使用官方轻量级 Node.js 12 映像。
# https://hub.docker.com/_/node
FROM node:12-slim
# 创建应用目录并切换到该目录。
WORKDIR /usr/src/app
# 将应用依赖项清单复制到容器映像。
# 这里会用到一个通配符,确保 package.json 和 package-lock.json(如有)都会被复制。
# 首先进行这项复制,这样就不需要在后续每次更改代码时都重新运行 npm install。
COPY package*.json ./
# 安装生产环境依赖项。
# 如果您添加了 package-lock.json,则可以改用“npm ci”来加快构建速度。
# RUN npm ci --only=production
RUN npm install --only=production
# 将本地代码复制到容器映像。
COPY . ./
# 在容器启动时运行该 Web 服务。
CMD [ "npm", "start" ]
-
按下 CTRL+X 键,然后依次按 Y 键和 Enter 键以保存 Dockerfile
文件。
-
接下来,在包含 Dockerfile
的目录中运行以下命令,使用 Cloud Build 构建容器映像。(请注意命令中的 $GOOGLE_CLOUD_PROJECT 环境变量,该变量包含您的实验的项目 ID):
gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
Cloud Build 服务可以在 Google Cloud 上执行您的构建任务。该服务会执行一系列构建步骤(每个步骤都在 Docker 容器中运行),以生成您的应用容器(或其他制品)并将其推送到 Artifact Registry,全部操作只需一个命令即可完成。
推送到注册表后,您会看到一条包含映像名称 (gcr.io/[PROJECT-ID]/helloworld
) 的消息,表明推送成功。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
- 使用下面的命令列出与您的当前项目关联的所有容器映像:
gcloud container images list
- 将
gcloud
注册为 Google 支持的所有 Docker 注册表的凭据帮助程序:
gcloud auth configure-docker
注意:系统可能会提示您:Do you want to continue? (y/N)?(是否要继续)。如果您同意继续,请输入 Y。
- 如需通过 Cloud Shell 在本地运行并测试应用,请使用下面的标准
docker
命令启动该应用:
docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
- 在 Cloud Shell 窗口中,点击网页预览并选择在端口 8080 上预览。
这应该会打开一个显示“Hello World!”消息的浏览器窗口。您也可以直接使用 curl localhost:8080
。
任务 4. 部署到 Cloud Run
- 使用下面的命令并指定您的项目 ID,将容器化应用部署到 Cloud Run:
gcloud run deploy --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld --allow-unauthenticated --region=$LOCATION
上面命令中的 allow-unauthenticated 标志让您的服务可公开访问。
- 出现提示时,按 Enter 键确认
service name
。
注意:系统可能会提示您:Do you want enable these APIs to continue (this will take a few minutes)? (y/N)?(是否要启用这些 API 以继续操作 [这可能需要几分钟时间])。如果您同意,请输入 Y 以启用所需的 API。
等待部署完成。
成功部署后,命令行中便会显示该服务的网址:
Service [helloworld] revision [helloworld-00001-xit] has been deployed
and is serving 100 percent of traffic.
Service URL: https://helloworld-h6cp412q3a-uc.a.run.app
现在,您可以在任何浏览器窗口中打开该服务网址,访问您部署的容器。
恭喜!您刚刚将容器映像中封装的应用部署到了 Cloud Run。Cloud Run 可以自动对您的容器映像进行横向扩容以处理收到的请求,并在需求减少时缩容。在您自己的环境中,您只需为在处理请求期间消耗的 CPU、内存和网络资源付费。
在本实验中,您使用的是 gcloud
命令行;当然,您也可以通过 Cloud 控制台来使用 Cloud Run。
- 从导航菜单的“无服务器”部分中,点击 Cloud Run,系统应该会列出您的
helloworld
服务:

任务 5. 清理
虽然 Cloud Run 不会针对未使用的服务收费,但您可能仍然需要为您构建的容器映像支付存储费用。
- 为避免产生费用,您可以删除您的 Google Cloud 项目,让系统停止对该项目中使用的所有资源计费;您也可以使用下面的命令直接删除您的
helloworld
映像:
gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
-
在系统提示您继续时,输入 Y
并按 Enter 键。
-
如需删除 Cloud Run 服务,请使用下面的命令:
gcloud run services delete helloworld --region={{{project_0.default_region | "REGION"}}}
- 在系统提示您继续时,输入
Y
并按 Enter 键。
结束实验
完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。
系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交。
星级数的含义如下:
- 1 颗星 = 非常不满意
- 2 颗星 = 不满意
- 3 颗星 = 一般
- 4 颗星 = 满意
- 5 颗星 = 非常满意
如果您不想提供反馈,可以关闭该对话框。
如果要留言反馈、提出建议或做出更正,请使用支持标签页。
恭喜!
您已完成本实验!
后续步骤/了解详情
如需详细了解如何使用源代码构建适用于 Cloud Run 的无状态 HTTP 容器,以及如何将其推送到 Artifact Registry,请查看下面的内容:
版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。