当前位置: 首页 > news >正文

Vue3 前端项目 Docker 容器化部署教程

本教程将带你从零开始,使用 Docker + Nginx 将一个 Vue3 前端项目打包并运行在容器中。我们会用到三个关键文件:

  1. .dockerignore —— 控制哪些文件不被复制进镜像
  2. Dockerfile —— 定义构建和运行镜像的步骤
  3. deploy/nginx.conf —— 配置 Nginx 作为静态资源服务器

最终效果:

  • 前端代码会在容器中构建
  • 构建产物交由 Nginx 提供服务
  • 支持 Vue Router history 模式
  • 可选反向代理后端 API
  • 启用 gzip 压缩和缓存优化

📂 项目结构示例

vue3-docker-app/
├── deploy/                     # 部署相关配置文件
│   └── nginx.conf              # Nginx 配置文件(生产环境)
...
├── .dockerignore               # Docker 构建忽略文件
├── Dockerfile                  # Docker 镜像构建文件
├── package.json                # 项目依赖和脚本
...

🔑 说明

  • deploy/:专门存放部署相关的配置文件(如 nginx.conf、CI/CD 脚本)
  • .dockerignore:避免无关文件进入镜像,减小体积
  • Dockerfile:定义构建和运行镜像的步骤
  • package.json:依赖和脚本管理

1️⃣ .dockerignore

.dockerignore 文件的作用类似于 .gitignore,它告诉 Docker 在构建镜像时不要复制哪些文件,避免无用文件进入镜像,减小体积并加快构建速度。

完整文件如下:

# 依赖目录
node_modules
npm-debug.log
.npm# 构建产物
dist
.output# 版本控制
.git
.gitignore# IDE 配置
.vscode
.idea
*.swp
*.swo
.DS_Store# 环境文件
#.env*.local
#.env.development
#.env.test# 日志文件
*.log
logs# 测试覆盖率
coverage
.nyc_output# 临时文件
*.tmp
.cache

📌 关键点解释:

  • node_modules:依赖会在容器内重新安装,不需要复制本地的
  • dist:构建产物会在容器内生成,不需要复制本地的
  • .git.vscode 等:开发环境文件,和运行无关
  • .env*:敏感环境变量文件,建议不要直接打包进镜像

2️⃣ Dockerfile

Dockerfile 定义了镜像的构建过程。这里采用 多阶段构建,先用 Node 构建前端,再用 Nginx 提供静态资源。

完整文件如下:

# -------------------------------
# 构建阶段:使用 Node 构建 Vue3 前端
# -------------------------------
FROM node:20-alpine AS buildWORKDIR /app# 设置 npm 镜像源和 Node.js 内存限制(提前设置)
RUN npm config set registry https://registry.npmmirror.com/
ENV NODE_OPTIONS="--max-old-space-size=4096"# 先复制依赖文件,利用 Docker 缓存(重要优化)
COPY package*.json ./# 安装依赖
RUN npm install# 再复制源码(不包括 node_modules,通过 .dockerignore 排除)
COPY . .# 构建
RUN npm run build# -------------------------------
# 运行阶段:使用 Nginx 提供静态资源
# -------------------------------
FROM nginx:1.28.0-alpineWORKDIR /usr/share/nginx/htmlRUN rm -rf ./*COPY --from=build /app/dist/ ./
COPY deploy/nginx.conf /etc/nginx/nginx.confEXPOSE 8080HEALTHCHECK --interval=30s --timeout=5s --retries=3 \CMD wget -qO- http://localhost:8080/ || exit 1CMD ["nginx", "-g", "daemon off;"]

📌 关键点解释:

  • 多阶段构建node:20-alpine 用来构建,nginx:alpine 用来运行,避免 Node 依赖进入最终镜像
  • COPY package*.json ./ + RUN npm install:利用 Docker 缓存机制,加快构建速度
  • ENV NODE_OPTIONS="--max-old-space-size=4096":避免大项目构建时内存不足
  • COPY --from=build /app/dist/ ./:只复制构建产物,镜像更小更干净
  • HEALTHCHECK:容器健康检查,确保服务正常

3️⃣ deploy/nginx.conf

Nginx 配置文件,负责提供静态资源、处理路由、反向代理 API。

完整文件如下:

user  nginx;
worker_processes auto;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;events {worker_connections  10240;multi_accept on;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;# 日志格式log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush      on;tcp_nodelay     on;keepalive_timeout  65;types_hash_max_size 2048;# -------------------------# 安全与优化配置# -------------------------server_tokens off;                 # 隐藏 Nginx 版本号client_max_body_size 10M;          # 限制上传大小client_body_timeout 12;            # 请求体超时client_header_timeout 12;          # 请求头超时keepalive_requests 1000;           # 单连接最大请求数# Gzip 压缩gzip on;gzip_min_length 1024;gzip_comp_level 6;gzip_types text/plain text/css application/javascript application/json application/xml text/xml image/svg+xml;gzip_vary on;gzip_proxied any;gzip_disable "msie6";# -------------------------# HTTPS 配置(生产环境推荐)# -------------------------server {listen 8080;   # 容器内监听 8080,避免 root 权限server_name _;root   /usr/share/nginx/html;index  index.html;# Vue3 前端路由 history 模式location / {try_files $uri $uri/ /index.html;}# 反向代理后端 API# location /api/ {#     proxy_pass   http://backend:48080/;   # 修改为后端服务地址#     proxy_http_version 1.1;#     proxy_set_header   Upgrade $http_upgrade;#     proxy_set_header   Connection "upgrade";#     proxy_set_header   Host $host;#     proxy_set_header   X-Real-IP $remote_addr;#     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;#     proxy_set_header   X-Forwarded-Proto $scheme;# }# 静态资源缓存策略location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg)$ {expires 6M;access_log off;add_header Cache-Control "public";}# 错误页面error_page  404              /index.html;error_page  500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}
}

📌 关键点解释:

  • try_files $uri $uri/ /index.html;:解决 Vue Router history 模式刷新 404 问题
  • gzip:开启压缩,减少传输体积
  • expires 6M;:静态资源缓存 6 个月,提升性能
  • proxy_pass:可选反向代理后端 API(需要时取消注释)
  • error_page 404 /index.html;:前端路由兜底

4️⃣ 构建与运行

在项目根目录执行:

# 构建镜像
docker build -t vue3-app .# 运行容器
docker run -d -p 8080:8080 --name vue3-app vue3-app

然后访问 👉 http://localhost:8080 即可看到前端页面。


5️⃣ 总结

通过这三个文件,我们实现了:

  • 干净高效的镜像构建(多阶段构建 + .dockerignore
  • 生产级 Nginx 配置(gzip、缓存、路由、反向代理)
  • 可扩展的部署方案(支持 CI/CD、K8s 等场景)
http://www.dtcms.com/a/569572.html

相关文章:

  • 子页网站设计高端网站开发找哪家好
  • 做外单的网站行业前10的网站建设公
  • 产业投资工作坊: 清洁能源赛道分析与投资实战
  • 上海工程建设招投标网站定制app软件
  • 【蓝牙】BLE 数据收发实战指南(手机 App ↔ 嵌入式 Linux/BlueZ)
  • 万象园网站建设与开发网站建设要架服务器
  • 【Cache缓存】cache的刷新
  • 水坑攻击的攻击原理和特点+案例和防御方法
  • Git 如何从某个 commit 新建分支
  • 做商业广告有什么网站好推销的无锡百姓网推广
  • 云南建个网站哪家便宜河北工程建设造价信息网
  • Spring Boot 集成 EMQ X 4.0 完整技术指南
  • git/github入门基操(终端版)
  • Spring Boot 集成 InfluxDB 2.x 完整技术指南
  • 汕头企业网站模板建站cm域名网站
  • 【Vue】Vue框架的基础知识强化
  • 计算机大类常见单词
  • 无头浏览器的效率救赎:Playwright连接复用与请求拦截技巧
  • dirname basename 命令
  • 邯郸网站制作基本流程网上销售网站建设
  • 如何优雅地找到二叉树的最近公共祖先?
  • 网站建设公司一般几个人成都设计公司装修
  • TOON 协议与 AIDotNet.Toon 实践指南
  • PPOCR 再编译
  • 网站关键词修改工作汇报总结怎么写
  • Vue 3模板如何通过编译三阶段实现从声明式语法到高效渲染的跨越
  • 做网站用的什么编程语言学编程的费用一般是多少
  • 智能家居技术发展与应用综述
  • linux udp广播数据包实际用例
  • 什么公司需要建立网站电商平台运营策略