web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程


目录

  1. Web 项目 Docker 化部署概述
  2. Dockerfile 详解
    • 构建阶段
    • 生产阶段
  3. 构建和运行 Docker 镜像

1. Web 项目 Docker 化部署概述

Docker 化部署的主要步骤分为以下几个阶段:

  1. 构建阶段(Build Stage):

    • 使用 Node.js 镜像或其他构建环境来安装依赖并构建前端项目。
    • 安装依赖、执行构建命令,生成生产环境的静态文件。
  2. 生产阶段(Production Stage):

    • 使用 Nginx 或其他 Web 服务器镜像,将构建后的静态文件部署到服务器,并通过反向代理提供服务。

在整个流程中,Dockerfile 是至关重要的文件,它定义了如何构建镜像以及如何将应用部署到容器中。


2. Dockerfile 详解

2.1 构建阶段(Build Stage)

在构建阶段,我们使用一个 Node.js 镜像来安装依赖、编译和构建前端项目。常见的构建工具有 npm、pnpm 或 yarn,这里以 pnpm 为例。

以下是构建阶段的详细 Dockerfile 配置:

# 使用 Node.js 镜像作为构建阶段的基础镜像
FROM node:20-alpine as build-stage# 设置工作目录
WORKDIR /app# 启用 corepack,并准备 pnpm 作为包管理工具
RUN corepack enable
RUN corepack prepare pnpm@latest --activate# 设置 npm 镜像源为国内镜像源,避免依赖下载慢
RUN npm config set registry https://registry.npmmirror.com# 复制 npm 配置文件、package.json 和 pnpm-lock.yaml
COPY .npmrc package.json pnpm-lock.yaml ./# 安装项目依赖,使用 frozen-lockfile 确保依赖一致
RUN pnpm install --frozen-lockfile# 复制项目的所有源文件到容器中
COPY . .# 执行构建命令,生成生产环境的静态文件
RUN pnpm build
关键步骤解析:
  • FROM node:20-alpine as build-stage:选择基于 Alpine 的 Node.js 镜像,轻量且包含必要的构建环境。
  • WORKDIR /app:设置工作目录为 /app,后续的所有命令将在此目录下执行。
  • RUN corepack enable:启用 corepack,这是一个包管理工具,用于支持 pnpm、yarn 等。
  • COPY .npmrc package.json pnpm-lock.yaml ./:复制项目的依赖配置文件(如 .npmrcpackage.jsonpnpm-lock.yaml)。
  • RUN pnpm install --frozen-lockfile:安装依赖,--frozen-lockfile 选项确保依赖锁文件不被修改。
  • RUN pnpm build:执行构建命令,生成静态资源。

2.2 生产阶段(Production Stage)

在生产阶段,我们使用 Nginx 镜像来提供静态文件服务。将构建阶段生成的静态文件拷贝到 Nginx 的服务目录,并启动 Nginx 服务。

以下是生产阶段的 Dockerfile 配置:

# 使用 Nginx 镜像作为生产阶段的基础镜像
FROM nginx:stable-alpine as production-stage# 将构建阶段生成的静态文件复制到 Nginx 默认的服务目录
COPY --from=build-stage /app/dist /usr/share/nginx/html# 设置监听端口为 80
EXPOSE 80# 启动 Nginx 服务
CMD ["nginx", "-g", "daemon off;"]
关键步骤解析:
  • FROM nginx:stable-alpine as production-stage:使用 Nginx 镜像作为生产阶段的基础镜像,选择稳定版 Alpine 版本。
  • COPY --from=build-stage /app/dist /usr/share/nginx/html:将构建阶段生成的静态文件从 build-stage 中复制到 Nginx 服务目录(/usr/share/nginx/html),这是 Nginx 默认的 Web 目录。
  • EXPOSE 80:暴露端口 80,供外部访问。
  • CMD ["nginx", "-g", "daemon off;"]:启动 Nginx 服务,-g daemon off; 让 Nginx 在前台运行,避免容器退出。

3. 构建和运行 Docker 镜像

3.1 构建 Docker 镜像

使用 docker build 命令根据 Dockerfile 构建镜像:

docker build -t my-web-app:latest .
  • -t my-web-app:latest:给镜像打上标签 my-web-app:latest
  • .:表示 Dockerfile 位于当前目录。

3.2 运行 Docker 容器

构建完成后,使用 docker run 启动容器:

docker run -d -p 8080:80 --name web-container my-web-app:latest
  • -d:后台运行容器。
  • -p 8080:80:将容器的 80 端口映射到本地的 8080 端口。
  • --name web-container:给容器指定名称 web-container
  • my-web-app:latest:使用刚刚构建的镜像启动容器。
补充一个更方便的本地验证命令(临时跑一下)

如果你只是想快速测,不想起名字、也不想后台跑,可以直接:

docker run --rm -p 8080:80 my-vue-app:latest
  • --rm:容器退出后自动删除
  • -d:直接前台打印 nginx 日志

更适合本地测试开发。

3.3 访问应用

成功启动容器后,访问以下 URL 即可看到你的应用:

http://localhost:8080

4.根据不同环境区分 Dockerfile 中的配置

4.1 使用 ARGENV 传递环境变量

在 Dockerfile 中,ARG 用于定义构建时参数,ENV 用于定义容器内的环境变量。通过这两者,可以在构建时传递不同的环境变量,来区分不同的配置。

示例:
ile复制编辑# 定义构建时参数
ARG NODE_ENV=production
# 将构建时参数传递给容器环境变量
ENV NODE_ENV=${NODE_ENV}

在构建镜像时,通过 --build-arg 来传递不同的环境:

bash复制编辑# 构建生产环境镜像
docker build --build-arg NODE_ENV=production -t my-web-app:prod .# 构建开发环境镜像
docker build --build-arg NODE_ENV=development -t my-web-app:dev .

在 Dockerfile 中使用 NODE_ENV 来选择不同的构建配置(如不同的静态文件或配置文件)。

4.2 根据不同的环境选择不同的配置文件

可以在 Dockerfile 中根据环境变量选择不同的配置文件。例如,使用 NODE_ENV 来决定是使用开发环境配置文件还是生产环境配置文件。

dockerfile复制编辑# 根据 NODE_ENV 选择不同的配置文件
COPY ./nginx/${NODE_ENV}.conf /etc/nginx/nginx.conf

在项目中准备不同的配置文件,如 nginx/production.confnginx/development.conf,然后根据 NODE_ENV 的值来选择使用哪个配置文件。

4.3 使用 .env 文件管理不同的环境变量

可以为不同环境准备不同的 .env 文件,然后在运行容器时加载对应的 .env 文件:

  1. 创建不同的 .env 文件:.env.production.env.development、.env.staging。
  2. docker-composedocker run 命令中使用 --env-file 来加载相应的 .env 文件:
docker run --env-file .env.production my-web-app:prod

这样可以根据不同的 .env 文件来配置不同的环境变量

注:也可以在build阶段直接写环境,例如:(根据项目中 package.json 中命令决定)

RUN pnpm build:staging

5. 总结

本文详细介绍了如何将 Web 项目 Docker 化部署,整个流程包括:

  1. 使用 Node.js 镜像进行构建,安装依赖并生成生产环境的静态文件。
  2. 使用 Nginx 镜像提供静态文件服务。
  3. 通过 Docker 构建镜像和启动容器,最终访问部署好的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上

题目:1667. 修复表中的名字 题解: select user_id, concat(upper(left(name,1)),lower(right(name,length(name)-1))) name from Users order by user_id题目:1527. 患某种疾病的患者 题解: select * from Patients where con…

随机算法一文深度全解

随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现(Python、Java、C) 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现(Python…

[论文阅读] 人工智能+软件工程 | 结对编程中的知识转移新图景

当AI成为编程搭档:结对编程中的知识转移新图景 论文信息 论文标题:From Developer Pairs to AI Copilots: A Comparative Study on Knowledge Transfer(从开发者结对到AI副驾驶:知识转移的对比研究) 作者及机构&#…

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…

Windows开机自动启动中间件

WinSW(Windows Service Wrapper 是一个开源的 Windows 服务包装器,它可以帮助你将应用程序打包成系统服务,并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…

数据结构排序

目录 1、插入排序 2、希尔排序 3、堆排序 4、直接选择排序 5、快排 6、归并排序 1、插入排序 void InsertSort(int* arr, int n) {int i 0;for (int i 0; i 1 < n; i){int end i;int tmp arr[end 1];while (end > 0){if (arr[end] > tmp){arr[end 1] ar…

大模型在创伤性脑出血全周期预测与诊疗方案中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、大模型预测脑出血的原理与技术基础 2.1 大模型概述 2.2 脑出血相关数据收集与预处理 2.3 机器学习算法在预测模型中的应用 2.4 模型训练与优化 三、术前风险预测与准备 3.1 术前…

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在网络上搜索onenet&#xff0c;注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT&#xff0c;其他的内容自己填写 6.这里产品以及开发完成&#xff0c;接下来就是添加设…

1.认识Spring

1.Spring简介 Spring是分层的Java SE/EE应用full-stack轻量级开源框架&#xff0c;以IOC&#xff08;反转控制&#xff09;和AOP&#xff08;面向切面编程&#xff09;为内核。提供了展现层、持久层以及业务层事务管理等众多的企业级应用技术&#xff0c;还能整合开源世界众多著…

Vue:Ajax

AJAX 允许我们在不刷新页面的情况下与服务器交互&#xff0c;实现&#xff1a;动态加载数据&#xff0c;提交表单信息&#xff0c;实时更新内容&#xff0c;与后端 API 通信。通常使用专门的 HTTP 客户端库来处理 AJAX 请求。 npm install axiosimport axios from axios;expor…

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…

智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体

在制造业转型升级的浪潮中&#xff0c;数字孪生技术正成为推动行业变革的核心引擎。从特斯拉通过数字孪生体实现车辆全生命周期优化&#xff0c;到海尔卡奥斯工业互联网平台赋能千行百业&#xff0c;数字孪生技术已从概念验证走向规模化落地。通过构建覆盖全国的交付网络&#…