文章目录

Node.js 部署:PM2 与 Docker

发布于 2026-04-02 15:30:24 · 浏览 9 次 · 评论 0 条

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 cinpm 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 在容器内管理,兼具两者优点。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文