Docker 编译 Node.js 项目并部署至 Nginx
本文介绍如何利用 Docker 和 Alpine 系统优化 Node.js 项目的编译与部署流程。通过构建包含预装依赖的基础镜像,显著缩短 npm install 时间。随后使用 Nginx 镜像托管编译后的静态资源,实现前后端分离的高效部署方案。
Docker 编译 Node.js 项目
1.编译Nodejs
利用 Docker 进行 Node.js 的编译工作变得十分便捷。
首先,从 hub.docker.com 获取最新的官方镜像,地址为 https://hub.docker.com/_/node/。

通常情况下,项目会选用 node6 版本的镜像。
docker pull node:6-alpine
获取镜像后,即可直接执行 npm install 命令安装依赖。
Alpine 是一个体积小巧的操作系统,因其占用磁盘空间小、下载迅速且部署快速,在 Docker 编译和运行场景中备受青睐。
这种做法能有效节省磁盘空间,并大幅减少部署所需的时间。
2.使用docker镜像提前下载库
然而,编译过程往往面临耗时过长的问题。
在使用 Node.js 进行开发时,项目中通常包含 package.json 文件,其中列出了具体的依赖包。下载这些依赖可能需要很长时间,一般建议配置阿里云镜像源以加速安装过程。
npm install --registry=https://registry.npm.taobao.org
但在 Docker 构建和编译时,每次都需要重新下载这些依赖,这极大地增加了编译的整体耗时。
构建预装依赖的基础镜像
FROM docker.io/library/node:6-alpine
RUN echo -e "http://mirrors.aliyun.com/alpine/v3.4/main\n\
http://mirrors.aliyun.com/alpine/v3.4/community" > /etc/apk/repositories
COPY package.json /root/
RUN cd /root && npm install --registry=https://registry.npm.taobao.org
为了解决这一问题,可以预先下载好镜像并制作成一个基础镜像,具体操作如下:
构建这个基础镜像的步骤如下:
docker build -t my-demo/node6-alpine:latest .
随后利用该镜像进行编译操作:
#!/bin/sh
mkdir /app && cd /app
git clone xxx.git /app
ln -s /root/.gnupg /app/.gnupg
ln -s /root/.npm /app/.npm
ln -s /root/node_modules /app/node_modules
npm install --registry=https://registry.npm.taobao.org
npm run build
build.sh
利用此基础镜像进行编译,可以省去之前繁琐的 install 过程。
其中 node_modules 是 Node.js 的模块文件夹,编译后的文件存放于 dist 文件夹内。
3.使用nginx启动
首先,从 https://hub.docker.com/_/nginx/ 下载 Nginx 镜像:

使用 Nginx 部署静态资源
FROM docker.io/library/nginx:1-alpine
ADD ./dist/* /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
使用 Nginx 镜像启动容器时,直接将 Node.js 编译后的文件放入 html 目录即可。
构建 Docker 镜像的命令如下:
docker build -t my-demo/nginx:latest .
启动 Docker 容器的命令如下:
docker run -itd -p 8080:80 my-demo/nginx:latest
配置完成后,直接访问 8080 端口即可访问服务。
总结:
(首发,请勿转载。)
当前前后端分离的开发模式虽能提高开发效率,但部署过程相对复杂,需要分别对前后端进行编译,且前端编译耗时较长。通过预先将依赖库打包成 Node 基础镜像,再进行编译,可大幅缩短编译时间。同时,运行环境采用 Nginx 镜像,将 HTML、CSS、JS 等资源文件部署其中,体积仅 20 多 MB。此外,Nginx 中还可配置后台 API,实现前后端集成。Docker 镜像的使用极大提升了开发效率,解决了环境安装配置的难题。
生产环境怎么自动移除JS的console.log语句?
2026-11-03 10:59:54
面试刷题必备:怎么利用在线JS沙箱高效验证算法
2026-11-03 09:11:28
使用 Vite 构建 Phaser.js 项目的配置与资源管理
2026-11-02 10:26:07
webpack 自动清理 dist 文件夹的两种实现方法
2026-10-31 14:14:29
Docker部署Jackett完整指南:CLI与Compose配置及索引器使用
2026-10-31 12:57:10
