零基础也能学会:Docker部署Node.js项目完整指南
前置准备
使用 Docker部署Node.js项目 前,需要做好以下准备:
- 一台安装了 Docker 的服务器(CentOS 7+ 或 Ubuntu 18.04+ 均可)。
- 一个可以正常运行的 Node.js 项目(比如 Express 应用),确保本地可启动。
- 知道项目监听端口(如 3000),以及需要的 Node.js 版本(如 18.x)。
- 服务器已开放对应端口(安全组或防火墙放行)。
如果你还没装 Docker,执行以下命令一键安装(以 CentOS 为例):
curl -fsSL https://get.docker.com | bash
sudo systemctl start docker
sudo systemctl enable docker分步操作
Step 1:准备项目文件
将你的 Node.js 项目上传到服务器(如 /opt/myapp),确保目录包含 package.json 和 app.js(或 index.js)。
Step 2:编写 Dockerfile
在项目根目录新建文件 Dockerfile,内容如下:
# 使用官方 Node 镜像作为基础
FROM node:18-alpine
设置工作目录
WORKDIR /app
复制 package.json 和 package-lock.json(如果有)
COPY package*.json ./
安装依赖
RUN npm install --production
复制项目所有文件
COPY . .
暴露端口(与项目监听端口一致)
EXPOSE 3000
启动命令
CMD ["node", "app.js"]
Step 3:构建镜像
在项目目录执行:
docker build -t my-node-app .-t指定镜像名称和标签,这里取名my-node-app。- 末尾的
.表示使用当前目录的 Dockerfile。
Step 4:运行容器
docker run -d -p 80:3000 --name node-server my-node-app-d后台运行。-p 80:3000将服务器 80 端口映射到容器内 3000 端口(这样用户访问服务器 IP 即可)。--name给容器取名方便管理。
如果项目依赖环境变量(如数据库连接),用 -e 传入:
docker run -d -p 80:3000 -e DB_HOST=192.168.1.100 --name node-server my-node-appStep 5:验证容器状态
docker ps看到 node-server 状态为 Up 即成功。
然后访问 http://服务器IP,应看到应用界面。
避坑指南
- 构建镜像时提示“package.json not found”:检查 Dockerfile 中的
COPY package*.json ./路径是否正确,确认文件存在于项目目录。 - 运行容器后立即退出:用
docker logs node-server查看日志,常见原因是端口被占用或应用启动出错(如缺少模块)。 - 端口映射不生效:检查服务器防火墙是否开放了映射的主机端口(如 80),并确认安全组已放行。
- 容器内时间与服务器不一致:可在运行命令中添加
-e TZ=Asia/Shanghai指定时区。
高频问题解答
Q1:如何更新项目代码?
修改项目文件后,重新构建镜像并替换旧容器:
# 停止并删除旧容器
docker stop node-server && docker rm node-server
重新构建
docker build -t my-node-app .
重新运行
docker run -d -p 80:3000 --name node-server my-node-app
Q2:如何查看应用日志?
使用 docker logs -f node-server 实时跟踪日志。
Q3:生产环境需要挂载数据卷吗?
如果项目需要持久化存储(如上传文件),推荐挂载数据卷:
docker run -d -p 80:3000 -v /opt/appdata:/app/uploads --name node-server my-node-app效果验证
完成部署后,通过以下方式确认 Docker部署Node.js项目 成功:
- 浏览器访问
http://服务器IP,页面正常加载。 - 终端执行
curl http://localhost:80返回正常 HTML。 - 执行
docker stats node-server查看资源占用,确认容器持续运行。
如果你正在处理 Docker部署Node.js项目,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。