使用 Docker 技术解决前端项目Node多版本并存问题

使用 Docker 技术解决前端项目Node多版本并存问题

背景:Node不同版本项目并存,导致经常使用 n、nvm 来切换 nodejs 版本很麻烦。

本文通过使用 Docker 技术,实现 node 多版本 并存启动项目,实现Nodejs版本完全隔离。

volta 也可以实现相同功能,本文主要讲 Docker 方向来实现。

主要思路

  1. 在项目根目录下创建 Dockefile 构建镜像
    1. FROM node:版本 > 控制Node版本号
    2. WORKDIR app > 设置 容器工作目录
      1. WORKDIR app
    3. 安装 PNPM
      1. RUN ["npm","install","pnpm","-g"]
    4. 暴露 5173 端口 (vite 启动的项目默认是 5173, 可以根据自己情况按需修改)
      1. EXPOSE 5173
    5. 容器运行时执行 npm run dev
      1. CMD ["pnpm","run","dev"]
  2. 构建 Nodejs 镜像
    1. docker build -t"node[版本号]" . , 可以存在 package.json 的 script 中
  3. 运行 Nodejs 容器
    1. docker run -it -p 5173:5173 -v ./:/app node[版本号]
    2. -p 将容器 5173 端口 暴露给宿主机,宿主机可以通过 5173(指定端口访问)
    3. -v ./:/app 卷技术,将项目挂载到容器/app目录下,实现联动,本地修改容器内对应的文件也会修改

解决方案

  1. 制作 Dockerfile
  1. 使用 npm run docker_build 构建镜像

  2. 使用 npm run docker 运行容器

注意 dev 要改成 vite --host , --host: 才可以使宿主机访问容器中的资源

启动成功 通过 localhost:5173 就可以访问

Network 不能直接访问(没强迫症的话可以不用管)

因为在 Docker 中使用默认的网络设置(通常是 bridge 网络),容器的 IP 地址通常是在私有网络上的局域网地址,宿主机默认情况下无法直接访问。这是由于 Docker 的网络隔离机制。

如果你想要在宿主机上直接访问容器内的服务,有几种方法可以实现:

  1. 使用端口映射

    就是 执行命令npm run docker 运行容器时,使用 -p 参数将容器内的端口映射到宿主机上。例如,将容器的 5173 端口映射到宿主机的 5173 端口:

    arduino 复制代码
    docker run -it -p 5173:5173
  2. 使用 Host 模式

    在运行容器时,使用 --network host 参数,这将使容器共享宿主机的网络命名空间,容器的网络将直接映射到宿主机上。

    bash 复制代码
    docker run --network host 

    使用 Host 模式可能会降低容器的网络隔离性,因为容器将与宿主机共享网络命名空间。

    选择其中一种方法取决于你的具体需求和安全策略。端口映射是最常见的方式,但 Host 模式可能在某些场景下更适用。

​

相关推荐
zhippt_10146 分钟前
只剩截图没有源文件?图转PPT把图片还原成可编辑幻灯片
前端·人工智能·powerpoint
shmily麻瓜小菜鸡32 分钟前
TypeScript 知识点补充(第三部分:工程化与高级类型)
前端·javascript·typescript
10岁的博客1 小时前
Chrome 扩展安全攻防实录:从权限模型到真实漏洞复盘
前端·chrome·安全
QianhangQianping1 小时前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
小郎君6581 小时前
(六)el-cascader 的展示值为什么不能直接 join:emitPath、路径还原与多选去重
vue.js·算法
wzg20161 小时前
ubuntu 离线安装 docker-compose
linux·ubuntu·docker
Eider19981 小时前
Python基础知识之并发相关-2
开发语言·前端·python
用户69371750013841 小时前
AI 能写代码,但工程架构还是应该由人来定
前端·后端
Hilaku1 小时前
前端的技术判断力是怎么练出来的?
前端·javascript·程序员
悠仁さん1 小时前
【C++】set map 使用
java·前端·c++