在 Docker 环境下使用 PM2 不仅可以管理进程,还能实现监控,但需要合理配置容器以适配 PM2 的特性。以下是具体实现方案及示例:
一、Docker 中使用 PM2 监控的关键点
使用
pm2-runtime
PM2 官方专为 Docker 设计了pm2-runtime
,它能:- 作为容器的主进程(PID 1),正确处理信号(如
SIGTERM
)。 - 自动将日志重定向到标准输出(
stdout
/stderr
),方便通过docker logs
查看。
- 作为容器的主进程(PID 1),正确处理信号(如
启用监控接口
- 通过环境变量开放 PM2 的监控端口(默认
9615
),允许外部工具(如 Prometheus)拉取指标。 - 或直接通过 PM2 的 HTTP API 查询状态。
- 通过环境变量开放 PM2 的监控端口(默认
二、Dockerfile 示例
1 | # 使用 Node.js 官方镜像 |
三、配套的 ecosystem.config.js
配置文件
1 | module.exports = { |
四、监控实现方式
1. 通过 PM2 HTTP API 获取指标
- PM2 默认在容器内启动 HTTP API 服务(端口
9615
),可直接查询状态:1
2# 进入容器内部执行(或通过端口映射外部访问)
curl http://localhost:9615/status - 输出示例:
1
2
3
4
5
6
7
8{
"status": "online",
"pm2_version": "5.3.0",
"node_version": "18.17.1",
"uptime": 3600,
"memory": 12053248,
"cpu_percent": 2.5
}
2. 集成外部监控工具
Prometheus + Grafana:
- 在
ecosystem.config.js
中启用 PM2 Prometheus exporter:1
2
3
4
5
6module.exports = {
apps: [{
// ...其他配置
metrics: true // 启用 Prometheus 格式的指标
}]
}; - 配置 Prometheus 抓取容器的
9615
端口指标。
- 在
端口映射:
在docker run
时暴露监控端口:1
docker run -p 3000:3000 -p 9615:9615 my-pm2-app
3. 直接查看容器日志
- PM2 日志已重定向到 Docker 标准输出:
1
docker logs -f <container_id>
五、生产环境注意事项
资源限制
在docker run
中设置内存和 CPU 限制:1
docker run -m 1G --cpus 2 my-pm2-app
日志轮转
安装pm2-logrotate
避免日志占满磁盘:1
2
3# 在 Dockerfile 中添加
RUN pm2 install pm2-logrotate
RUN pm2 set pm2-logrotate:max_size 100M健康检查
在 Dockerfile 或docker-compose.yml
中添加健康检查:1
2HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/health || exit 1
六、完整流程示例
构建镜像:
1
docker build -t my-pm2-app .
运行容器(映射监控端口):
1
docker run -p 3000:3000 -p 9615:9615 my-pm2-app
查看监控数据:
- 通过浏览器:访问
http://localhost:9615
查看 PM2 内置监控。 - 通过 Prometheus:配置抓取
http://localhost:9615/metrics
。
- 通过浏览器:访问
通过以上配置,你可以在 Docker 环境中充分利用 PM2 的进程管理和监控能力,确保应用的高可用性和可观测性。