Docker环境使用PM2


在 Docker 环境下使用 PM2 不仅可以管理进程,还能实现监控,但需要合理配置容器以适配 PM2 的特性。以下是具体实现方案及示例:


一、Docker 中使用 PM2 监控的关键点

  1. 使用 pm2-runtime
    PM2 官方专为 Docker 设计了 pm2-runtime,它能:

    • 作为容器的主进程(PID 1),正确处理信号(如 SIGTERM)。
    • 自动将日志重定向到标准输出(stdout/stderr),方便通过 docker logs 查看。
  2. 启用监控接口

    • 通过环境变量开放 PM2 的监控端口(默认 9615),允许外部工具(如 Prometheus)拉取指标。
    • 或直接通过 PM2 的 HTTP API 查询状态。

二、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
# 使用 Node.js 官方镜像
FROM node:18-alpine

# 安装 PM2 全局依赖
RUN npm install pm2 -g

# 设置容器工作目录
WORKDIR /app

# 复制应用代码和依赖清单
COPY package*.json ./
COPY src ./src

# 安装生产依赖(清理缓存以减小镜像体积)
RUN npm install --production && \
npm cache clean --force

# 复制 PM2 配置文件(监控、集群等设置)
COPY ecosystem.config.js .

# 暴露应用端口和 PM2 监控端口
EXPOSE 3000 9615

# 启动命令:使用 pm2-runtime 运行,保持容器活跃
CMD ["pm2-runtime", "ecosystem.config.js"]

三、配套的 ecosystem.config.js 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module.exports = {
apps: [{
name: "my-api",
script: "src/app.js",
instances: "max", // 根据 CPU 核心数启动集群
exec_mode: "cluster", // 集群模式
env: {
NODE_ENV: "production",
PORT: 3000
},
// 监控配置
pmx: true, // 启用 PM2 扩展监控
node_args: "--max-old-space-size=512", // 限制内存
watch: false, // 生产环境关闭文件监听
log_date_format: "YYYY-MM-DD HH:mm Z", // 日志时间格式
merge_logs: true // 集群模式下合并日志
}]
};

四、监控实现方式

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

    1. ecosystem.config.js 中启用 PM2 Prometheus exporter:
      1
      2
      3
      4
      5
      6
      module.exports = {
      apps: [{
      // ...其他配置
      metrics: true // 启用 Prometheus 格式的指标
      }]
      };
    2. 配置 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>

五、生产环境注意事项

  1. 资源限制
    docker run 中设置内存和 CPU 限制:

    1
    docker run -m 1G --cpus 2 my-pm2-app
  2. 日志轮转
    安装 pm2-logrotate 避免日志占满磁盘:

    1
    2
    3
    # 在 Dockerfile 中添加
    RUN pm2 install pm2-logrotate
    RUN pm2 set pm2-logrotate:max_size 100M
  3. 健康检查
    在 Dockerfile 或 docker-compose.yml 中添加健康检查:

    1
    2
    HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost:3000/health || exit 1

六、完整流程示例

  1. 构建镜像

    1
    docker build -t my-pm2-app .
  2. 运行容器(映射监控端口):

    1
    docker run -p 3000:3000 -p 9615:9615 my-pm2-app
  3. 查看监控数据

    • 通过浏览器:访问 http://localhost:9615 查看 PM2 内置监控。
    • 通过 Prometheus:配置抓取 http://localhost:9615/metrics

通过以上配置,你可以在 Docker 环境中充分利用 PM2 的进程管理和监控能力,确保应用的高可用性和可观测性。