在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查看运行的容器内部情况 pm2运行情况

要不要在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会将应用拉起来,这样就可以保证整体程序不会因错误而频繁重启容器。