keymetrics/pm2PM2 Docker镜像是一个生产就绪的Node.js环境镜像,集成了PM2运行时。该镜像旨在将Node.js应用程序封装到适合生产环境的容器中,解决在容器内运行Node.js应用时的关键问题,包括:
此外,通过PM2作为容器与应用之间的中间层,可利用PM2的丰富特性,如应用声明文件、自定义日志系统、源码映射支持等,简化生产环境中Node.js应用的管理。
ecosystem.config.js/pm2.json)、日志管理、进程监控等核心功能基于Alpine Linux,轻量级且资源占用低,适合对镜像大小敏感的场景。
| 镜像名称 | 操作系统 | Dockerfile |
|---|---|---|
keymetrics/pm2:latest-alpine | Alpine | latest-alpine |
keymetrics/pm2:24-alpine | Alpine | 24-alpine |
keymetrics/pm2:22-alpine | Alpine | 22-alpine |
keymetrics/pm2:20-alpine | Alpine | 20-alpine |
keymetrics/pm2:18-alpine | Alpine | 18-alpine |
基于Debian Bookworm,提供更完整的系统工具和库支持。
| 镜像名称 | 操作系统 | Dockerfile |
|---|---|---|
keymetrics/pm2:latest-bookworm | Debian Bookworm | latest-bookworm |
keymetrics/pm2:24-bookworm | Debian Bookworm | 24-bookworm |
keymetrics/pm2:22-bookworm | Debian Bookworm | 22-bookworm |
keymetrics/pm2:20-bookworm | Debian Bookworm | 20-bookworm |
keymetrics/pm2:18-bookworm | Debian Bookworm | 18-bookworm |
基于Debian Bullseye,适合需要稳定旧版本Debian环境的应用。
| 镜像名称 | 操作系统 | Dockerfile |
|---|---|---|
keymetrics/pm2:latest-bullseye | Debian Bullseye | latest-bullseye |
keymetrics/pm2:24-bullseye | Debian Bullseye | 24-bullseye |
keymetrics/pm2:22-bullseye | Debian Bullseye | 22-bullseye |
keymetrics/pm2:20-bullseye | Debian Bullseye | 20-bullseye |
keymetrics/pm2:18-bullseye | Debian Bullseye | 18-bullseye |
基于Debian Buster,支持旧版Node.js应用。
| 镜像名称 | 操作系统 | Dockerfile |
|---|---|---|
keymetrics/pm2:latest-buster | Debian Buster | latest-buster |
keymetrics/pm2:20-buster | Debian Buster | 20-buster |
keymetrics/pm2:18-buster | Debian Buster | 18-buster |
基于Debian Bookworm的精简版本,仅包含核心依赖,镜像体积更小。
| 镜像名称 | 操作系统 | Dockerfile |
|---|---|---|
keymetrics/pm2:latest-slim | Debian Bookworm (最小化包) | latest-slim |
keymetrics/pm2:24-slim | Debian Bookworm (最小化包) | 24-slim |
keymetrics/pm2:22-slim | Debian Bookworm (最小化包) | 22-slim |
keymetrics/pm2:20-slim | Debian Bookworm (最小化包) | 20-slim |
keymetrics/pm2:18-slim | Debian Bookworm (最小化包) | 18-slim |
有关镜像变体的更多信息,请参见Node.js Docker镜像文档。
假设项目结构如下:
`-- your-app-name/ |-- src/ `-- app.js # 应用入口文件 |-- package.json # 依赖配置 |-- pm2.json # PM2应用声明文件(需创建) `-- Dockerfile # 镜像构建文件(需创建)
创建pm2.json文件,定义应用配置:
json{ "name": "your-app-name", // 应用名称 "script": "src/app.js", // 入口文件路径 "instances": "2", // 启动实例数("max"表示使用所有CPU核心) "env": { // 默认环境变量 "NODE_ENV": "development" }, "env_production": { // 生产环境变量(通过--env production激活) "NODE_ENV": "production" }, "kill_timeout": 3000 // 优雅关闭超时时间(毫秒) }
应用声明文件支持更多配置项,详见PM2应用声明文档。
dockerfile# 选择基础镜像(根据需求替换标签,如latest-alpine、24-bookworm等) FROM keymetrics/pm2:latest-alpine # 复制应用代码和配置文件 COPY src/ src/ COPY package.json . COPY pm2.json . # 安装生产依赖 ENV NPM_CONFIG_LOGLEVEL warn RUN npm install --production # 显示目录结构(可选,用于调试) RUN ls -al -R # 使用pm2-runtime启动应用(必须使用pm2-runtime而非pm2 start以确保信号正确处理) CMD ["pm2-runtime", "start", "pm2.json"]
在项目根目录执行以下命令:
bash# 构建镜像 docker build -t your-app-name . # 运行容器 docker run -d -p 3000:3000 --name your-app-instance your-app-name
如需指定生产环境变量,可修改启动命令为:
docker run -d your-app-name pm2-runtime start pm2.json --env production
创建docker-compose.yml文件:
yamlversion: '3.8' services: app: build: . image: your-app-name container_name: your-app-instance restart: always ports: - "3000:3000" # 映射应用端口(根据实际应用调整) environment: - NODE_ENV=production # 如需集成Keymetrics,添加以下环境变量 # - KEYMETRICS_PUBLIC=your_public_key # - KEYMETRICS_SECRET=your_secret_key volumes: - ./logs:/app/.pm2/logs # 挂载日志目录(可选) command: ["pm2-runtime", "start", "pm2.json", "--env", "production"]
启动服务:
bashdocker-compose up -d
通过PM2模块实现应用代码与Git仓库自动同步:
dockerfileRUN pm2 install pm2-auto-pull
.git目录(构建时需复制.git文件夹):dockerfileCOPY .git/ .git/ # 添加到COPY步骤
详细配置参见pm2-auto-pull文档。
安装PM2服务器监控模块,监控系统资源使用情况:
在Dockerfile中添加:
dockerfileRUN pm2 install pm2-server-monit
监控数据可通过PM2日志或Keymetrics面板查看,详见pm2-server-monit文档。
Keymetrics.io是基于PM2的监控服务,提供日志查看、进程重启、异常监控等功能。使用步骤:
在Keymetrics创建Bucket,获取公钥(PUBLIC KEY)和密钥(SECRET KEY)
通过环境变量配置密钥:
bashdocker run -d \ -e KEYMETRICS_PUBLIC=your_public_key \ -e KEYMETRICS_SECRET=your_secret_key \ --name your-app-instance your-app-name
集成问题排查参见Keymetrics故障排除文档。
当容器接收关闭信号(如SIGINT、SIGTERM)时,PM2会将信号转发给应用,允许应用完成收尾工作(如关闭数据库连接、保存状态)。
在Node.js应用中添加信号处理逻辑:
javascriptprocess.on('SIGINT', () => { console.log('开始优雅关闭...'); // 关闭数据库连接示例 mongoose.connection.close(false, (err) => { console.log('MongoDB连接已关闭'); process.exit(err ? 1 : 0); }); // 其他清理操作(如停止定时任务、完成当前请求等) });
调整关闭超时时间(默认1600ms):在pm2.json中添加:
json{ "kill_timeout": 3000 // 超时时间(毫秒) }
通过--web选项启用PM2健康检查API,暴露应用和容器的关键指标:
修改Dockerfile的CMD命令:
dockerfile# 不指定端口时默认使用9615 CMD ["pm2-runtime", "start", "pm2.json", "--web"] # 或指定自定义端口 CMD ["pm2-runtime", "start", "pm2.json", "--web", "3001"]
访问[***]可获取JSON格式的健康数据,包含:
| 命令 | 描述 |
|---|---|
docker exec -it <容器ID> pm2 monit | 交互式监控各进程CPU/内存使用率 |
docker exec -it <容器ID> pm2 list | 列出所有运行中的进程 |
docker exec -it <容器ID> pm2 show <应用名/ID> | 查看指定应用的详细信息 |
docker exec -it <容器ID> pm2 logs | 查看所有应用日志 |
docker exec -it <容器ID> pm2 logs <应用名> | 查看指定应用日志 |
docker exec -it <容器ID> pm2 reload all | 零停机重启所有应用 |
docker exec -it <容器ID> pm2 restart <应用名> | 重启指定应用 |
docker exec -it <容器ID> pm2 stop all | 停止所有应用 |
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务