使用 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 模式可能在某些场景下更适用。

相关推荐
ZC跨境爬虫5 分钟前
Playwright进阶操作:鼠标拖拽与各类点击实战(含自定义拖拽实例)
前端·爬虫·python·ui
小江的记录本8 分钟前
【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
java·前端·分布式·后端·spring·rabbitmq·mvc
心静财富之门9 分钟前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python
星空11 分钟前
前端--A_4--HTML表单
前端
We་ct22 分钟前
JS手撕:DOM操作 & 浏览器API高频场景详解
开发语言·前端·javascript·面试·状态模式·操作·考点
小江的记录本28 分钟前
【RocketMQ】RocketMQ核心知识体系全解(5大核心模块:架构模型、事务消息两阶段提交、回查机制、延迟消息、顺序消息)
linux·运维·服务器·前端·后端·架构·rocketmq
三万棵雪松31 分钟前
【Linux 物联网网关主控系统-Web部分(二)】
linux·前端·物联网
We་ct40 分钟前
LeetCode 137. 只出现一次的数字 II:从基础到最优的两种解法详解
前端·数据结构·算法·leetcode·typescript·位运算
源码站~41 分钟前
基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现
java·vue.js·spring boot·后端·mysql·毕业设计·毕设
星空42 分钟前
前端--A_3--HTML区块_块元素与行内元素
前端·html