【Docker 实践】Node

2025-12-08 10:36:48

目录:

一、Dockerfile

机器上没有 Nodejs 运行环境,或者已安装的 Nodejs 版本不符合要求,使用 Docker 创建 node 容器来运行项目代码,并且需要支持热更新,方便开发调试。

以 dumi 项目为例进行介绍,其它脚手架比如 create-react-app 思路都是类似的。

安装 dumi 项目:

$ npx @umijs/create-dumi-lib

1.1 本地测试

根目录下创建 Dockerfile 文件并写入如下内容:

如果项目根目录下已经有 package-lock.json 文件,可以将 npm install 改为 npm ci 这样安装依赖会更快。

# 使用官方Node.js镜像作为基础,选择与项目兼容的版本(如18、20)
FROM node:20.19.6-alpine

# 在容器内设置工作目录,所有后续命令将在此目录下执行
WORKDIR /app

# 首先复制依赖定义文件,利用Docker层缓存优化构建速度
COPY package*.json ./

# 安装项目依赖。在开发环境中,通常安装所有依赖(包括devDependencies)
RUN npm install --registry=https://registry.npmmirror.com/

# 复制项目所有源代码到容器(注意:运行时将通过挂载覆盖此拷贝,此步骤主要为初始化)
COPY . .

# 暴露React开发服务器默认端口
EXPOSE 8000

# 启动开发服务器。使用npm start,其背后通常是react-scripts start,支持热模块替换(HMR)
CMD ["npm", "start"]

构建镜像并创建容器:

# 构建镜像
$ docker build -t my-react-app .
# 创建容器
$ docker run -it -p 8000:8000 --name my-react-app-dev -v .:/app -v /app/node_modules my-react-app
  • -it 将容器内的打印信息在宿主机上显示出来;
  • -p 8000:8000 将容器的端口8000映射到宿主机的8000端口;
  • --name my-react-app-dev 定义容器名称,方便后续重启容器;
  • -v .:/app 将当前目录与容器内 /app 目录进行挂载,实现代码同步;
  • -v /app/node_modules 防止宿主机 node_modules 覆盖容器内的 node_modules;
  • my-react-app 镜像名称;

容器跑起来之后,在浏览器中访问 http://localhost:8000/ 即可访问项目。在宿主机中修改文件,可以看到网站上也会实时更新,方便开发调试。

如果不开发了,Ctrl + C 退出容器即可。之后想要继续开发,启动容器即可。

$ docker start my-react-app-dev

如果要删除容器,最好加上 -v 参数,会删除容器相关数据卷,卷里面有 node_modules 文件,会占用磁盘空间。

$ docker rm -v my-react-app-dev

1.2 生产环境

机器上没有 Nodejs 运行环境,或者已安装的 Nodejs 版本不符合要求,有一个前端项目,需要使用 Docker 创建 node 容器运行代码,执行 npm run build 构建项目代码,并且构建产物 dist 目录在宿主机上也要存在。

$ docker run -it \
--name my-react-app-prod \
-v .:/app \
-v /app/node_modules \
-w /app \
node:20.19.6-alpine \
sh -c "npm install && npm run build"

说明:项目根目录下如果存在 package-lock.json 文件,可以将 npm install 改为 npm ci 这样安装依赖会更快。

之后再要编译只需要执行

$ docker start my-react-app-prod

如果想要在终端中看到编译过程,可以加上 -a 参数。

$ docker start -a my-react-app-prod

docker-compose

2.1 本地测试

机器上没有 Nodejs 运行环境,或者已安装的 Nodejs 版本不符合要求,使用 Docker 创建 node 容器来运行项目代码,并且需要支持热更新,方便开发调试。

以 dumi 项目为例进行介绍,其它脚手架比如 create-react-app 思路都是类似的。

安装 dumi 项目:

$ npx @umijs/create-dumi-lib

项目根目录下创建 Dockerfile 文件并写入如下内容:

如果项目根目录下已经有 package-lock.json 文件,可以将 npm install 改为 npm ci 这样安装依赖会更快。

# 使用官方Node.js镜像作为基础,选择与项目兼容的版本(如18、20)
FROM node:20.19.6-alpine

# 在容器内设置工作目录,所有后续命令将在此目录下执行
WORKDIR /app

# 首先复制依赖定义文件,利用Docker层缓存优化构建速度
COPY package*.json ./

# 安装项目依赖。在开发环境中,通常安装所有依赖(包括devDependencies)
RUN npm install --registry=https://registry.npmmirror.com/

# 复制项目所有源代码到容器(注意:运行时将通过挂载覆盖此拷贝,此步骤主要为初始化)
COPY . .

# 暴露React开发服务器默认端口
EXPOSE 8000

# 启动开发服务器。使用npm start,其背后通常是react-scripts start,支持热模块替换(HMR)
CMD ["npm", "start"]

项目根目录下创建 docker-compose.yml 文件并写入如下内容:

services:
  react-dev:
    build:
      context: .  # 使用当前目录下的Dockerfile构建镜像
      dockerfile: Dockerfile
    container_name: my-react-app-dev
    ports:
      - "8000:8000"  # 将宿主机的3000端口映射到容器的3000端口
    volumes:
      # 绑定挂载:将宿主机当前目录挂载到容器的/app目录,实现代码同步
      - .:/app
      # 重要:防止宿主机node_modules覆盖容器内的node_modules
      - /app/node_modules
    # 可选:设置环境变量,确保文件系统监听在Docker内正常工作
    environment:
      - CHOKIDAR_USEPOLLING=true
      - WATCHPACK_POLLING=true
    # 保持容器在前台运行,便于查看日志
    stdin_open: true
    tty: true

启动容器后在浏览器中访问 http://localhost:8000/ 即可访问项目。在宿主机中修改文件,可以看到网站上也会实时更新,方便开发调试。

$ docker-compose up --build

第一次运行时添加 --build 参数,在容器启动之前会构建 Docker 镜像,这个过程会安装依赖,后续运行就不需要再加 --build 参数了,除非 package.json 文件有更改,需要再加 --build 参数重新构建镜像。

$ docker-compose up --build
$ docker-compose up
$ docker-compose down -v   # 移除容器并删除所有相关数据卷

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: