制作Node.js镜像

本文介绍如何在本地制作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

    成功推送后,您可以登录容器镜像服务控制台,在目标镜像仓库的镜像版本页面查看推送的版本。

步骤三:部署镜像

以下仅介绍本文相关的配置项,其余信息,请参见通过镜像部署Web应用

  1. SAE控制台>应用管理>Web应用,从顶部菜单栏选择地域,然后单击创建应用

    image

  1. 设置应用部署方式选择镜像部署,并单击设置镜像,选择您已准备好的应用镜像仓库和镜像版本。为定位到所需的镜像仓库,请单击我的阿里云镜像,并选择镜像仓库所在的镜像服务版本和命名空间。

    image

    image

  1. HTTP监听端口设置为镜像对外提供服务的端口。

    image

  1. 单击一键创建应用,并等待应用部署完成。

步骤四:访问应用

SAE为您的应用提供默认的访问地址,您可以通过公网访问应用通过私网访问应用;在实际的生产环境中,建议您为应用关联自定义域名,并使终端用户通过自定义域名访问应用