前端搞部署-docker遇见pm2

4,250 阅读3分钟

前言

目前行业的发展,对前端有node方向技能点的要求越来越普遍,特别在中后台的场景(ps:这里的中后台主要特点就是,不涉及高并发,大流量的c端场景)下,node全栈的价值可以体现的淋漓尽致,高效迭代-支持快速试错和探索性场景(大白话,不用等待跨团队的资源就位,前端就能hold住)。既然要去搞服务端,必然逃不开部署和运维的相关内容了(没办法,学不动也得学)。

背景知识

pm2

可能对于刚接触的同学(包括我)来说,启动一个node服务,直接run下面

node xxx.js

不就完了,为啥还要牵扯到pm2这个进程守护工具。
详细的介绍可以直接去pm2 官网查看。 1、内建负载均衡(使用Node cluster 集群模块) 2、线程守护,keep alive 3、0秒停机重载,维护升级的时候不需要停机. 4、Linux (stable) & MacOSx (stable) & Windows (stable).多平台支持 5、停止不稳定的进程(避免无限循环) 6、控制台检测 7、提供 HTTP API 8、远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

我这里简单一句话总结下: 避免单线程的node因异常导致的服务挂掉,并且提升cpu利用率。

dcoker

摘抄百科的简介docker: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口.

docker 的优点

yeasy.gitbook.io/docker_prac…

  1. 更高效的利用系统资源
  2. 更快速的启动时间
  3. 一致的运行环境
  4. 持续交付和部署
  5. 更轻松的迁移
  6. 更轻松的维护和扩展

具体到我们 更多的是出于 1和3的原因(毕竟机器有限和环境隔离很必要)。

问题描述

下面就是轻松的使用 dcoker 来部署 我们的node服务了。

两者相遇

"start": "pm2 start ./dispatch.js ",

问题描述

docker 始终不能启动。

image.png

查看日志

docker logs -f 55b9ddb92541

pm2启动好好的 image.png

原因:

因为pm2 是默认后台启动的, docker 感知不到。。。CMD命令执行完成,docker 容器就结束了。 所以 直接node xx 的时候一直运行着。 pm2以后台形式运行,docker 就认为 可以退出了。

The problem is that pm2 start runs pm2 as a daemon ("in the background"), which Docker isn't aware of.

You need to use pm2-runtime to make it run in the foreground:

CMD [ "pm2-runtime", "start", "npm", "--", "start" ]
See pm2 "Container integration" docs.

所以需要使用 pm2-runtime 来进行 处理。

  • pm2-runtime是为Docker容器设计的,它将应用程序置于前台,从而使容器保持运行状态。

结束语

参考文章