Node.js 部署:PM2 与 Docker
部署 Node.js 应用时,选择合适的工具能显著提升稳定性与可维护性。PM2 适合单机进程管理,Docker 则擅长环境隔离与跨平台部署。本文手把手教你分别用 PM2 和 Docker 部署一个标准 Express 应用,并说明何时该用哪种方案。
准备工作:创建一个基础 Node.js 应用
创建项目目录并初始化:
mkdir my-node-app
cd my-node-app
npm init -y
安装 Express:
npm install express
创建入口文件 app.js:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello from Node.js!');
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
确保应用能本地运行:
node app.js
访问 http://localhost:3000 应看到 "Hello from Node.js!"。停止服务(按 Ctrl + C),继续下一步。
方案一:使用 PM2 部署
PM2 是一个生产级的 Node.js 进程管理器,能自动重启崩溃进程、支持集群模式、提供日志管理。
安装 PM2
全局安装 PM2:
npm install -g pm2
启动应用
启动你的应用:
pm2 start app.js --name "my-app"
--name 参数为进程指定易读名称,方便后续管理。
管理应用
-
查看运行状态:
pm2 list -
查看实时日志:
pm2 logs my-app -
重启应用(代码更新后):
pm2 restart my-app -
停止应用:
pm2 stop my-app
开机自启(可选)
生成系统启动脚本(以 Ubuntu/Debian 为例):
pm2 startup
终端会输出一条带 sudo 的命令,复制并执行它。然后保存当前进程列表:
pm2 save
此后服务器重启时,PM2 会自动拉起你的应用。
方案二:使用 Docker 部署
Docker 将应用及其依赖打包成镜像,确保“一次构建,处处运行”,特别适合多环境一致性或容器编排场景。
编写 Dockerfile
创建文件 Dockerfile(无扩展名):
# 使用官方 Node.js 18 镜像作为基础
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package*.json(利用 Docker 层缓存加速构建)
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "app.js"]
关键点说明:
npm ci比npm install更快且严格,适合 CI/CD。--only=production不安装开发依赖,减小镜像体积。EXPOSE是文档性声明,实际端口映射在运行时指定。
构建镜像
构建名为 my-node-app 的镜像:
docker build -t my-node-app .
. 表示使用当前目录的 Dockerfile。
运行容器
启动容器并映射端口:
docker run -d -p 3000:3000 --name my-running-app my-node-app
参数说明:
-d:后台运行(detached mode)-p 3000:3000:将主机 3000 端口映射到容器 3000 端口--name:为容器指定名称
验证应用是否运行:
curl http://localhost:3000
应返回 "Hello from Node.js!"。
管理容器
-
查看运行中的容器:
docker ps -
查看日志:
docker logs my-running-app -
停止容器:
docker stop my-running-app -
删除容器(停止后):
docker rm my-running-app
PM2 vs Docker:如何选择?
选择依据主要看部署规模和团队需求。以下是关键对比:
| 维度 | PM2 | Docker |
|---|---|---|
| 适用场景 | 单台服务器部署少量应用 | 多环境一致、微服务、云原生架构 |
| 资源开销 | 低(直接运行于主机) | 中(容器化有轻微开销) |
| 隔离性 | 无(共享主机环境) | 强(文件系统、网络、进程隔离) |
| 学习成本 | 低(只需掌握几个命令) | 中(需理解镜像、容器、网络等概念) |
| 扩展性 | 手动扩展(每台机器单独配置) | 易与 Kubernetes、Docker Compose 集成 |
若你只有一台云服务器,且应用简单,PM2 足够高效。若需部署多个服务、保证开发测试生产环境一致,或计划上云,Docker 是更可持续的选择。
进阶技巧:PM2 + Docker 组合使用
有时两者可结合:在 Docker 容器内使用 PM2 管理进程。这适用于需要 PM2 的高级功能(如集群模式、性能监控)但又希望保留容器化优势的场景。
修改 Dockerfile 的启动命令:
# ... 前面内容不变 ...
# 安装 PM2
RUN npm install -g pm2
# 使用 PM2 启动(--no-daemon 防止容器退出)
CMD ["pm2-runtime", "app.js", "--name", "my-app"]
注意必须使用 pm2-runtime 而非 pm2 start,否则容器会立即退出。
构建并运行:
docker build -t my-node-app-pm2 .
docker run -d -p 3000:3000 my-node-app-pm2
此时应用由 PM2 在容器内管理,兼具两者优点。

暂无评论,快来抢沙发吧!