本文介绍如何在本地制作Node.js镜像,并以镜像方式将应用部署到Serverless应用引擎SAE(Serverless App Engine)

前提条件

步骤一:准备项目

  1. 创建一个用于存放Node.js资源的项目文件夹,命名为node
  2. 执行以下命令,进入项目目录。
    cd node
  3. 创建并编辑server.js的文件,文件内容如下:
    const ronin     = require( 'ronin-server' )
    const mocks     = require( 'ronin-mocks' )
    
    const server = ronin.server()
    
    server.use( '/', mocks.server( server.Router(), false, true ) )
    server.start()
  4. 创建并编辑package.json文件,文件内容如下:
    {
      "name": "node_sae_demo",
      "version": "1.0.0",
      "description": "",
      "main": "server.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "node server.js"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
        "ronin-mocks": "^0.1.4",
        "ronin-server": "^0.1.3"
      }
    }
  5. 本地验证。
    1. 执行以下命令,安装依赖。
      npm install --production

      --production表示只扫描dependencies节点下的依赖。

    2. 执行以下命令,运行项目。
      node server.js
    3. 打开一个新的终端,执行以下命令,查看请求是否返回正常。
      curl 'http://127.0.0.1:8000/test'

      输出如下。

      • 新终端:
        {"code":"success","meta":{"total":0,"count":0},"payload":[]}
      • 现有终端,输出示例如下:
        2021-**-**T14:36:05:1050  INFO: GET /test

步骤二:制作镜像

  1. node目录下,创建并编辑Dockerfile文件,文件内容如下:
    本文以Node.js 12.18.1为例。
    FROM node:12.18.1
    ENV NODE_ENV=production
    
    WORKDIR /app
    
    COPY ["package.json", "./"]
    
    # 可选,您也可以将本地的node_modules拷贝进来,而不是制作镜像的过程中再安装依赖,会拖慢镜像的构建。
    # RUN COPY node_modules .
    RUN npm install --production
    
    COPY . .
    
    # 如果没用pm2,可以不需要docker-entrypoint.sh。
    COPY docker-entrypoint.sh /usr/local/bin/
    
    CMD [ "node", "server.js" ]
  2. node目录下,创建并编辑docker-entrypoint.sh文件,文件内容如下:
    #!/bin/sh
    # https://github.com/nodejs/docker-node/blob/main/docker-entrypoint.sh
    set -e
    
    if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ]; then
      set -- node "$@"
    fi
    
    # 启动命令前先清理部分对Node.js无用的环境变量,避免部分框架(PM2等)因为环境变量过长而导致系统崩溃。
    echo "remove options"
    unset JAVA_TOOL_OPTIONS
    
    exec "$@"
  3. 容器镜像服务控制台创建镜像仓库。
    个人版和企业版实例均适用本文的操作,本文以个人版实例为例。具体操作,请参见以下文档:
  4. 执行以下命令,构建并推送镜像。
    您可以在目标镜像仓库的基本信息页面的镜像指南页签查询具体命令。更多信息,请参见以下文档:
    1. 执行以下命令,构建镜像。
      docker build --tag node-demo:v1 .

      输出示例如下:

      Sending build context to Docker daemon  12.82MB
      Step 1/8 : FROM node:12.18.1
       ---> f5be1883****
      ......
      Step 8/8 : CMD [ "node", "server.js" ]
       ---> Running in e96b27dd****
      Removing intermediate container e96b27dd****
       ---> 73028a1d****
      Successfully built 73028a1d****
    2. 执行以下命令,登录远端镜像仓库。
      本步骤假设您使用的是阿里云ACR仓库。
      docker login --username=<镜像仓库登录名> registry.<regionId>.aliyuncs.com

      示例如下:

      docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
      在返回结果中输入密码,如果显示login succeeded,则表示登录成功。如何设置密码,请参见设置镜像仓库登录密码
    3. 执行以下命令,给镜像打标签。
      docker tag <ImageId> registry.<regionId>.aliyuncs.com/****/node-demo:<镜像版本号>
      • ImageId:镜像ID。
      • registry.<regionId>.aliyuncs.com/****/node-demo:镜像仓库地址。

      示例如下:

      docker tag node-demo:v1 registry.cn-hangzhou.aliyuncs.com/****/node-demo:v1
    4. 执行以下命令,推送镜像至个人版实例。
      docker push registry.<regionId>.aliyuncs.com/****/node-demo:<镜像版本号>

      示例如下:

      docker push registry.cn-hangzhou.aliyuncs.com/****/node-demo:v1
    成功推送后,您可以登录容器镜像服务控制台,在目标镜像仓库的镜像版本页面查看推送的版本。

步骤三:部署镜像

  1. 创建Node.js应用。
    应用部署配置配置向导页面,技术栈语言需选择其它语言应用部署方式需选择镜像。具体操作,请参见在SAE控制台使用镜像部署多语言应用sc_create_node_application_via_image
    说明 除创建新应用外,您还可以修改现有应用的配置镜像。具体操作,请参见升级应用
  2. 为Node.js应用绑定公网SLB。
    选择HTTP协议,并将HTTP端口设置为80容器端口设置为8000。具体操作,请参见为应用绑定SLBsc_create_slb
    绑定完成后,您可以在应用访问设置区域查看公网访问地址。sc_view_Internet_IP
  3. 结果验证。
    按照http://slbip:port/的格式,在浏览器地址栏输入步骤2设置的公网地址并回车。结果如下:pg_verify_Internet_IP

更多信息

如果您不想每次都通过手动方式构建、推送镜像,并部署应用,可以对接开源的Jenkins或者阿里云云效。具体信息,请参见以下文档: