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

Vue 3 前端和 Spring Boot 后端生成 Docker 镜像的标准做法

Vue 3 前端和 Spring Boot 后端生成 Docker 镜像的标准做法:


Vue 3 前端项目生成 Docker 镜像

前提条件

  1. Vue 项目可以通过 npm run build 生成静态文件(通常在 dist 目录)。
  2. 项目根目录下有 package.json 文件。

步骤

  1. 创建 Dockerfile
    在 Vue 项目根目录创建 Dockerfile(无扩展名):

    # ========== 第一阶段:构建阶段 ==========
    FROM node:18 AS builder# 设置工作目录
    WORKDIR /app# 先复制依赖文件(利用Docker缓存层加速构建)
    COPY package*.json ./# 安装依赖
    RUN npm install# 复制项目源代码
    COPY . .# 构建生产版本(生成 dist/ 目录)
    RUN npm run build# ========== 第二阶段:运行阶段 ==========
    FROM nginx:stable-alpine# 从构建阶段复制静态文件到Nginx服务器目录
    COPY --from=builder /app/dist /usr/share/nginx/html# 暴露80端口(Nginx默认端口)
    EXPOSE 80# Nginx基础镜像已有默认启动命令,无需额外指定
    

    优化点:如果你的项目路由使用 history 模式(而非 hash 模式),需自定义 Nginx 配置处理路由回退:

    # 创建自定义nginx配置
    COPY nginx.conf /etc/nginx/conf.d/default.conf
    

    nginx.conf 示例:

    server {listen 80;location / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html; # 处理history模式回退}
    }
    
  2. 创建 .dockerignore 文件
    在项目根目录创建 .dockerignore,避免不必要的文件进入镜像:

    node_modules/
    .git
    .vscode
    dist/
    Dockerfile
    *.md
    docker-compose.yml
    
  3. 构建前端镜像
    在项目根目录执行:

    docker build -t your-registry/vue-app:1.0.0 .
    
  4. 测试运行

    docker run -d -p 8080:80 your-registry/vue-app:1.0.0
    

    访问 http://localhost:8080 验证

  5. 推送到镜像仓库

    docker push your-registry/vue-app:1.0.0
    

Spring Boot 后端项目生成 Docker 镜像

前提条件

  1. 项目可通过 mvn clean package 或 Gradle 构建生成可执行 JAR(通常位于 target/*.jar)。
  2. 使用 JDK 17+(推荐Spring Boot 3+的版本)。

步骤

  1. 创建 Dockerfile
    在 Spring Boot 项目根目录(与 pom.xml 同级)创建 Dockerfile

    # ========== 第一阶段:构建阶段 ==========
    FROM maven:3.8.7-eclipse-temurin-17 AS builder# 设置工作目录
    WORKDIR /app# 先复制POM文件(利用Docker缓存层加速依赖下载)
    COPY pom.xml .# 下载依赖(此步骤会缓存,除非pom.xml改变)
    RUN mvn dependency:go-offline# 复制源代码
    COPY src ./src# 打包应用(跳过测试)
    RUN mvn package -DskipTests# ========== 第二阶段:运行阶段 ==========
    FROM eclipse-temurin:17-jre-alpine# 设置工作目录
    WORKDIR /app# 从构建阶段复制构建好的JAR文件
    COPY --from=builder /app/target/*.jar ./app.jar# 设置JVM参数(根据需求调整)
    ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75"# 暴露应用端口(与application.properties中server.port一致)
    EXPOSE 8080# 启动应用
    ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar"]
    

    重要优化

    • 使用 eclipse-temurin 官方镜像(OpenJDK的厂商中立版本)
    • 使用 -jre-alpine 后缀保持镜像最小化
    • JAVA_OPTS 包含 -XX:+UseContainerSupport 让JVM感知容器资源限制
  2. 创建 .dockerignore 文件

    .git
    .mvn
    target/
    *.iml
    *.log
    .project
    .classpath
    .settings/
    
  3. 构建后端镜像

    docker build -t your-registry/springboot-app:1.0.0 .
    
  4. 测试运行

    # 简单测试
    docker run -d -p 8080:8080 your-registry/springboot-app:1.0.0# 带环境变量测试(如数据库连接)
    docker run -d -p 8080:8080 \-e SPRING_DATASOURCE_URL=jdbc:mysql://db-host:3306/dbname \-e SPRING_DATASOURCE_USERNAME=root \-e SPRING_DATASOURCE_PASSWORD=secret \your-registry/springboot-app:1.0.0
    
  5. 推送到镜像仓库

    docker push your-registry/springboot-app:1.0.0
    

关键注意事项:生产环境部署

给运维提供什么?

  1. 镜像地址

    • your-registry/vue-app:1.0.0
    • your-registry/springboot-app:1.0.0
  2. 必要配置(通过环境变量或配置文件):

    ## 前端 (Vue) 通常无需特殊配置,除非:
    - 环境特定的API基础URL
    - 认证配置## 后端 (Spring Boot) 关键配置:
    - 数据库连接:SPRING_DATASOURCE_URL, SPRING_DATASOURCE_USERNAME, SPRING_DATASOURCE_PASSWORD
    - Redis配置:SPRING_REDIS_HOST, SPRING_REDIS_PORT
    - JWT密钥:JWT_SECRET_KEY
    - 文件存储路径:FILE_UPLOAD_DIR
    
  3. 健康检查端点(对运维重要):

    # 在application.properties中添加
    management.endpoints.web.exposure.include=health,info
    management.endpoint.health.show-details=always
    

    运维可通过 http://your-app:8080/actuator/health 监控服务状态

  4. 推荐提供 docker-compose.yml 示例

    version: '3.8'
    services:frontend:image: your-registry/vue-app:1.0.0ports:- "80:80"environment:- API_BASE_URL=http://backend:8080/apibackend:image: your-registry/springboot-app:1.0.0ports:- "8080:8080"environment:- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/appdb- SPRING_DATASOURCE_USERNAME=appuser- SPRING_DATASOURCE_PASSWORD=securepassword- SPRING_REDIS_HOST=redismysql:image: mysql:8.0environment:MYSQL_DATABASE: appdbMYSQL_USER: appuserMYSQL_PASSWORD: securepasswordMYSQL_ROOT_PASSWORD: rootsecretredis:image: redis:6-alpine
    

总结流程

本地开发调试完成
创建Dockerfile
创建.dockerignore
构建镜像 docker build
测试运行 docker run
推送镜像 docker push
告知运维镜像地址+配置
运维在生产环境部署

通过以上步骤,你就能将 Vue 3 前端和 Spring Boot 后端打包成符合生产环境要求的 Docker 镜像。关键点是:

  1. 使用多阶段构建减小镜像体积
  2. 使用 Alpine 基础镜像优化大小
  3. 配置合理的 JVM 参数(尤其内存设置)
  4. 通过 环境变量 注入配置
  5. 提供清晰的 健康检查端点

这样打包好的镜像,就能交给运维团队部署到生产环境的 Kubernetes 集群或 Docker Swarm 集群中了。


文章转载自:

http://XwfUzhQf.fprLL.cn
http://F9pzt8FJ.fprLL.cn
http://noenaZ8F.fprLL.cn
http://ItklBzRZ.fprLL.cn
http://CYmPaUgq.fprLL.cn
http://VkL2vtYy.fprLL.cn
http://A6CzlgFy.fprLL.cn
http://b4XzvAWT.fprLL.cn
http://3Vz76G9z.fprLL.cn
http://jNnA209A.fprLL.cn
http://JziWmhvU.fprLL.cn
http://r8wKyv2C.fprLL.cn
http://64rTXuSB.fprLL.cn
http://jtHo7P6Y.fprLL.cn
http://Wibax1r6.fprLL.cn
http://JSoiEhxr.fprLL.cn
http://PW87JPRr.fprLL.cn
http://9On13eoz.fprLL.cn
http://3wRSiil4.fprLL.cn
http://j52f19Cu.fprLL.cn
http://8xSuHa1a.fprLL.cn
http://j44k7pT3.fprLL.cn
http://uV5vTaaJ.fprLL.cn
http://3D011mOS.fprLL.cn
http://klMl0f0I.fprLL.cn
http://sogRVQXH.fprLL.cn
http://Wcii3MGX.fprLL.cn
http://oU2L6xET.fprLL.cn
http://c5JUlMvg.fprLL.cn
http://G7PG6Hpi.fprLL.cn
http://www.dtcms.com/a/246127.html

相关文章:

  • CentOS7下MySQL8.0的安装到基本操作
  • ubuntu网络连接失败 + mobaxterm拖拽文件出错等问题解决方法
  • 42 C 语言随机数生成:rand() 与 srand() 深度解析、生成指定范围随机数、应用实战
  • vue通过路由传参时布尔类型问题
  • 力扣-198.打家劫舍
  • Excel大厂自动化报表实战(互联网金融-数据分析周报制作上)
  • 2.倒排索引
  • 补充讲解perfetto/systrace的CPU Trace信息详解和抓取方法
  • 博图SCL语言教程:灵活加、减计数制作自己的增减计数器(CTUD)
  • VUE - AxiosError-ERR_BAD_REQUEST
  • ZooKeeper详解以及应用部署(AI)
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(34):ようですそうですばかりのに
  • C#学习第30天: 匹配模式
  • 多模态AI爬虫:文本+图像智能抓取实战
  • opencv opencv_contrib vs2020 源码安装
  • 【2025】深度学习环境搭建记录
  • Spring Boot Actuator 健康信息
  • C++学习-入门到精通【19】杂项汇总
  • 强化学习:DQN学习总结
  • 【完整源码+数据集+部署教程】太阳能板灰尘检测系统源码和数据集:改进yolo11-LVMB
  • Vue3+TypeScript实现迭代器模式
  • 基于多面体模型的编译优化技术
  • 代码训练LeetCode(32)Z字形变换
  • 浅谈MapReduce--基本操作
  • Vue开发学习笔记:动态渲染自定义封装的uview-plus的Toast组件
  • 大模型技术30讲-5-利用数据来减少过拟合现象
  • 上海市计算机学会竞赛平台2022年5月月赛丙组最远城市距离
  • 新零售视域下实体与虚拟店融合的技术逻辑与商业模式创新——基于开源AI智能名片与链动2+1模式的S2B2C生态构建
  • win11系统部署tomcat10教程
  • @SchedulerLock处理Spring Task在分布式环境下的重复执行问题