使用 Cloud Run on Node.js 部署并运行容器

Cloud Run 是一个托管式计算平台,供您运行可通过 HTTP 请求调用的无状态容器。Cloud Run 采用无服务器设计,因此无需进行基础架构管理,让您可以专注于最重要的工作,即构建出色的应用。它基于 Knative 构建而成,可让您选择使用 Cloud Run(全托管式)或 Cloud Run for Anthos 运行容器。此 Codelab 的目标是构建容器映像并将其部署到 Cloud Run。

前提条件

不适用

自定进度的环境设置

如果您还没有 Google 账号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:

2016-02-10 12:45:26 的屏幕截图.png

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一名称(很抱歉,上述名称已被占用,您无法使用!)。它稍后将在此 Codelab 中被称为 PROJECT_ID

接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。

在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。

Google Cloud Platform 的新用户有资格获享 $300 免费试用

Cloud Shell

虽然您可以从笔记本电脑远程操作 Google Cloud,但在此 Codelab 中,您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境。

基于 Debian 的这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。这意味着在本 Codelab 中,您只需要一个浏览器(没错,它适用于 Chromebook)。

如需激活 Google Cloud Shell,只需在开发者控制台中点击右上角的按钮(预配和连接到环境仅需花费一些时间):

activateCloudShell.png

点击“启动 Cloud Shell”按钮:

Screen Shot 2017-06-14 at 10.13.43 PM.png

连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的 PROJECT_ID

gcloud auth list

命令输出

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

默认情况下,Cloud Shell 还会设置一些环境变量,这对您日后运行命令可能会很有用。

echo $GOOGLE_CLOUD_PROJECT

命令输出

<PROJECT_ID>

如果出于某种原因未设置项目,只需发出以下命令即可:

gcloud config set project <PROJECT_ID>

正在查找您的 PROJECT_ID?检查您在设置步骤中使用的 ID,或在控制台信息中心查找该 ID:

Project_ID.png

重要提示:最后,设置默认可用区和项目配置:

gcloud config set compute/zone us-central1-f

您可以选择各种不同的可用区。如需了解详情,请参阅“区域和地区”说明文档

启用 Cloud Run API

在 Cloud Shell 中,启用 Cloud Run API。

gcloud services enable run.googleapis.com

这应该会生成一条类似于以下内容的成功消息:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

您将构建一个基于 Express 的简单 Node.js 应用来响应 HTTP 请求。

如需构建应用,请使用 Cloud Shell 创建一个名为 helloworld-nodejs 的新目录,然后切换到该目录。

mkdir helloworld-nodejs
cd helloworld-nodejs

创建一个包含以下内容的 package.json 文件:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

请务必注意,上面的文件包含一个 start 脚本命令和一个 Express Web 应用框架依赖项。

接下来,在同一目录中,创建一个 index.js 文件,并将以下内容复制到该文件中:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

该代码会创建一个基本 Web 服务器,以侦听由 PORT 环境变量定义的端口。您的应用现已准备就绪,可以进行容器化、测试并上传到 Container Registry。

如需将示例应用容器化,请在与源文件相同的目录中创建一个名为 Dockerfile 的新文件,并将以下内容复制到此文件中:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

接下来,在包含 Dockerfile 的目录中运行以下命令,使用 Cloud Build 构建容器映像:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT 是一个环境变量,在 Cloud Shell 中运行时包含您的 Google Cloud 项目 ID。您也可以通过运行 gcloud config get-value project 获取该 ID。

推送到注册表后,您会看到一条包含映像名称 (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld) 的 SUCCESS 消息。该映像存储在 Container Registry 中,并可根据需要重复使用。

您可以使用以下命令列出与您的当前项目关联的所有容器映像:

gcloud container images list

如果您想通过 Cloud Shell 在本地运行并测试应用,可以使用下面的标准 docker 命令启动该应用:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

在 Cloud Shell 中,点击网页预览,然后选择在端口 8080 上预览

系统会打开一个显示 Hello World! 的浏览器窗口。

您也可以直接使用 curl localhost:8080

使用以下命令将容器化应用部署到 Cloud Run(请务必根据您构建的应用调整为正确的映像名称,或使用 gcr.io/cloudrun/hello 预构建的映像):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

通过 --allow-unauthenticated 部署选项,您可以在不进行身份验证的情况下访问应用。--platform managed \ 部署选项表示您请求的是全托管式环境(而不是通过 Anthos 请求 Kubernetes 基础架构)。

等待部署完成。 完成后,命令行会显示服务网址。

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

现在,您可以在网络浏览器中打开该服务网址,访问您部署的容器:

Cloud Run 可以自动对您的容器映像进行横向扩容以处理收到的请求,并在需求减少时缩容。您只需为在处理请求期间消耗的 CPU、内存和网络付费。

虽然 Cloud Run 不会对未在使用中的服务计费,但您可能仍然需要为您构建的容器映像支付存储费用。

为避免产生费用,您可以删除您的 Google Cloud 项目,让系统停止对该项目使用的所有资源计费;您也可以使用下面的命令直接删除您的 helloworld 映像:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

如需删除 Cloud Run 服务,请使用以下命令:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

恭喜!您已将封装在容器映像中的应用部署到 Cloud Run。

了解详情

建议您接下来查看快速入门:部署到 Cloud Run for Anthos on Google Cloud

如需详细了解如何使用源代码构建适用于 Cloud Run 的无状态 HTTP 容器并将其推送到 Container Registry,请参阅以下资源:

如需详细了解 Knative(底层开源项目),请参阅 Knative