docker 跟 node.js 最佳实践

1.jpg

Level-1 简单实现

需求:简单的构建一个app应用并且用docker部署。
Dockerfile编写为:

1
2
3
4
5
6
7
8
9
10
FROM node:7.3.0

RUN mkdir -p /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app

EXPOSE 3000

CMD npm start


Leve1-2 增加pm2

需求:虽然我上了Docker了吧,但是没有进程守护心里怕怕的。
PS:除了使用pm2外,另外还有一说是在启动docker时候添加restart=always 也可以实现自动重启。
在在PS:pm2也有 docker了,即pm2-docke

1
2
3
4
5
6
7
8
9
10
FROM node:7.3.0

RUN mkdir -p /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app

EXPOSE 3000

CMD ["pm2","start", "pm2.json","--no-daemon"]

Leve-3 使用shell脚本,执行多任务带参数的启动

需求:在启动的时候要执行多个带变量的命令、
这样的话CMD就满足不了了,只能上shell脚本来完成
docker_start.sh为:

1
2
3
4
5
6
7
8
9
10
11
12
13
 #!/bin/sh


NODE_ENV=$1

if [ -z $NODE_ENV ]
then echo "please input NODE_ENV"
exit 1
fi

echo $NODE_ENV

pm2 start pm2.json --env $NODE_ENV --no-daemon

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
26
27
28
29
30
FROM node:boron

# Install global pm2
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org


# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install --registry=https://registry.npm.taobao.org


# Bundle app source
COPY . /usr/src/app

ENV NODE_ENV dev

RUN ["chmod", "+x", "/usr/src/app/docker_start.sh"]
CMD /bin/bash /usr/src/app/docker_start.sh $NODE_ENV

EXPOSE 3000

# Build image
# docker build -t pm2_test:v1 .

# Run docker
# docker run -e NODE_ENV=staging --name pm2_test -p 3500:3500 -d pm2_test:v1

重点说明: 其中的变量是NODE_ENV,所以在run的时候环境变量会替换到Dockerfile中的ENV,这就是精华所在。

以上,就是最近docker实践心得。

坚持原创技术分享,您的支持将鼓励我继续创作!