在docker中运行nodejs
首先看项目目录:
再看Dockerfile文件内容:
# 以最新的node为基础镜像
FROM hub.c.163.com/library/node:latest
# 工作目录为app
WORKDIR /app
# 拷贝当前所在项目根目录到app目录
COPY . /app
# 全局安装pm2
RUN npm install pm2 -g
EXPOSE 8081
#使用pm2启动nodejs,如果没有--no-daemon参数docker启动后就退出
CMD ["pm2-runtime", "dest/server.js", "--no-daemon"]
# ENTRYPOINT ["node", "server.js"]
或者在Dockerfile中不添加CMD命令,可以在启动docker时执行命令:
docker run --name ks -ti -p 8081:8081 kser:pm2 pm2-runtime dest/server.js
如果是后台运行的docker:
docker run --name ks -d -p 8081:8081 kser:pm2 pm2-runtime dest/server.js
-d
选项是后台运行
需要进入到docker查看pm2运行情况
,可以通过docker exec -ti ks /bin/sh
查看运行的容器内部情况
要不要在docker中使用pm2运行nodejs
- pm2可以监控nodejs进程,如果进程挂了,可以自动重启
- pm2可以设置启动的nodejs进程个数,提高服务性能
- pm2可以设置日志记录
- pm2可以设置端口,避免端口冲突
docker已经提供了自动重启的功能,可以这样启动nodejs服务:
docker run --name ks -d --restart=always -p 8081:8081 kser:pm2 pm2-runtime dest/server.js
–restart=always参数可以保证服务宕机时自动重启,那么既然docker已经提供了自动重启功能,为什么还要用pm2呢? 如果只是简单的启动一个nodejs服务,pm2的功能可以忽略。但是docker在重启后会丢失内容,比如生成的文件日志原本在容器内,重启后就丢失了,而使用pm2的话,pm2始终是运行的,应用宕机后pm2会将应用拉起来,这样就可以保证整体程序不会因错误而频繁重启容器。