Docker - 制作Nodejs镜像

本文基于腾讯云云服务器CVM系统工具配置文章的基础上,在腾讯云云服务器(CentOS系统)上基于镜像文件Dockerfile制作 Nodejs 镜像。

本教程的示例代码: node-v16.14.0-image

Dockerfile

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Nodejs 服务镜像
# - https://hub.docker.com/_/centos?tab=tags&page=1
FROM centos:centos7.9.2009

WORKDIR /opt/app

LABEL maintainer="luqiangzeng@gmail.com"

# 定义环境变量
ENV NODE_PATH /usr/local/services/node

# 启动脚本
COPY ./scripts/pod-tools/ /opt/app/scripts/
# nodejs 安装包
COPY ./packages/node-v16.14.0-linux-x64 ${NODE_PATH}

# node app demo 代码
ADD ./src ./node

# 设置软链
RUN ln -s ${NODE_PATH}/bin/node /usr/local/bin/node && \
ln -s ${NODE_PATH}/bin/npm /usr/local/bin/npm


ENTRYPOINT ["/opt/app/scripts/run.sh"]

run.sh 启动脚本

run.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 启动 nodejs 服务
cd /opt/app/node
npm i
nohup node /opt/app/node/app.js &

# run the command given as arguments from CMD
exec "$@"

node app demo

src/app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const http = require('http');
const os = require('os');

const { logger } = require('./utils/log4js/index');
const PORT = 9090;

const handler = (request, response) => {
const remoteAddressInfo = `Recei ved request from ${request.connection.remoteAddress}`;
logger.info(remoteAddressInfo);

response.writeHead(200);
const resMsg = `You've hit ${os.hostname()}.\n`;
logger.info(resMsg);
response.end(resMsg);
}

var app = http.createServer(handler);
app.listen(PORT);

console.log(`
You can now view node-app in the browser.
Local: http://localhost:${PORT}
`);

使用 log4js 打印日志。

构建镜像,并发布至 Docker Hub

构建镜像

1
2
3
4
git clone https://github.com/lqmeta/examples.git
cd examples/node-v16.14.0/
npm run docker:build
docker images

发布至 Docker Hub

1
2
3
4
5
docker image tag node-v16.14.0:latest luqiangzeng/node-v16.14.0:1.0.0
docker image tag node-v16.14.0:latest luqiangzeng/node-v16.14.0:latest

docker push luqiangzeng/node-v16.14.0:1.0.0
docker push luqiangzeng/node-v16.14.0:latest

使用 Docker Compose 部署

docker-compose.yaml

docker-compose/docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "2"
networks:
default:
driver: bridge

services:
node-app-demo:
restart: always
# 镜像
image: luqiangzeng/node-v16.14.0:1.0.0
container_name: node-app-demo
ports:
- "9090:9090"
command: /usr/sbin/init

启动应用

1
2
3
4
5
6
# 启动
npm run compose:up
# 查看
npm run compose:ps
# 测试验证
curl http://localhost:9090

这里在项目中添加了些 npm scripts 指令:

1
2
3
4
npm run compose:up
# 实际执行了 `docker-compose -f ./docker-compose/docker-compose.yaml up -d`
npm run compose:ps
# 实际执行了 `docker-compose -f ./docker-compose/docker-compose.yaml ps`

更新 docker-compose.yml 文件镜像后容器的更新启动

  • v1.0.0版本 - luqiangzeng/node-v16.14.0:1.0.0
    1
    2
    [coder@VM-228-146-centos node-v16.14.0]$ curl http://localhost:9090
    You've hit 7c2cdf1ddff9.

更新下一个版本迭代:

  • v1.0.1版本 - luqiangzeng/node-v16.14.0:1.0.1
    1
    2
    [coder@VM-228-146-centos node-v16.14.0]$ curl http://localhost:9090
    You've hit 7c2cdf1ddff9.(v1.0.1)

下面三个步骤进行升级更新:
1、先发布镜像 v1.0.1版本。
2、修改 docker-compose/docker-compose.yaml 的 image。
3、执行 npm run compose:update 更新 node-app-demo 容器。

1
npm run compose:update

参考文档