从零到部署:将Spring Boot + Vue项目打包为Docker镜像并实现动态配置

从零到部署:将Spring Boot + Vue项目打包为Docker镜像并实现动态配置

摘要
本文将手把手教你如何将Spring Boot后端与Vue前端整合为一个Docker镜像,实现一键化部署、动态参数配置,并支持后续迭代更新。无论你是个人开发者还是团队项目,这份指南都能助你快速构建生产级容器化应用。


一、准备工作

1. 项目结构

假设你的项目目录如下(需提前构建):

my-app/
├── backend/              # Spring Boot项目目录
│   ├── src/
│   └── pom.xml
└── frontend/             # Vue项目目录
    ├── dist/             (构建后生成)
    ├── src/
    └── package.json

2. 工具要求

  • JDK 11+
  • Node.js 14+
  • Maven 3.8+
  • Docker 20.10+

二、整合前后端

步骤1:构建Vue前端

cd frontend
npm install
npm run build        # 生成dist/目录

步骤2:将静态资源嵌入Spring Boot

  1. frontend/dist下的所有文件复制到backend/src/main/resources/static
  2. (可选)处理前端路由:
    创建WebMvcConfig.java
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            // 匹配所有非静态资源路径
            registry.addViewController("/{path:\\w+}")
                    .setViewName("forward:/index.html");
            registry.addViewController("/{path:\\w+}/{subpath:.*}")
                    .setViewName("forward:/index.html");
        }
    }
    

三、配置后端参数动态化

方案1:环境变量注入

application.properties中使用占位符:

# 数据库配置示例
spring.datasource.url=${DB_URL:jdbc:mysql://localhost:3306/defaultdb}
spring.datasource.username=${DB_USER:root}
spring.datasource.password=${DB_PWD:123456}

# 自定义参数示例
app.notification.email=${NOTIFY_EMAIL:agu@example.com}

方案2:外部配置文件

创建config/application.properties

# 优先级高于jar包内部配置
app.max.upload.size=50MB
app.debug.mode=false

四、编写Dockerfile(多阶段构建)

# Stage 1: 构建前端
FROM node:14 as frontend
WORKDIR /app
COPY frontend/package*.json ./
RUN npm install
COPY frontend .
RUN npm run build

# Stage 2: 构建后端
FROM maven:3.8.6-openjdk-11 as backend
WORKDIR /app
COPY backend .
COPY --from=frontend /app/dist /app/src/main/resources/static
RUN mvn clean package -DskipTests

# Stage 3: 运行环境
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=backend /app/target/*.jar app.jar

# 配置参数入口
ENV SPRING_CONFIG_LOCATION=optional:file:/config/
VOLUME /config
EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

五、构建与运行

1. 构建镜像

docker build -t my-app:v1 .

2. 运行容器

方式一:纯环境变量

docker run -d -p 8080:8080 \
  -e DB_URL=jdbc:mysql://host.docker.internal:3306/proddb \
  -e DB_USER=prod_user \
  -e DB_PWD=S3cr3t! \
  my-app:v1

方式二:挂载配置文件

# 本地创建配置文件
mkdir -p ~/app-config
echo "app.max.upload.size=100MB" > ~/app-config/application.properties

docker run -d -p 8080:8080 \
  -v ~/app-config:/config \
  my-app:v1

六、迭代更新流程

1. 开发阶段

# 前端热更新
cd frontend && npm run serve

# 后端热加载(需IDE支持)
mvn spring-boot:run

2. 生产更新

  1. 修改代码后重新构建:
    docker build -t my-app:v2 .
    
  2. 滚动更新(零停机):
    # 启动新版本
    docker run -d --name my-app-v2 -p 8081:8080 my-app:v2
    
    # 切换流量后下线旧版本
    docker stop my-app-v1 && docker rm my-app-v1
    

七、高级技巧

1. 使用Docker Compose

创建docker-compose.yml

version: '3.8'
services:
  app:
    image: my-app:v1
    ports:
      - "8080:8080"
    volumes:
      - ./config:/config
    environment:
      - TZ=Asia/Shanghai
    deploy:
      resources:
        limits:
          memory: 1GB

2. 配置健康检查

在Dockerfile中添加:

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

3. 使用CI/CD(GitHub Actions示例)

name: Build and Push
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build Docker image
      run: |
        docker build -t my-app:${GITHUB_SHA} .
    - name: Push to Registry
      uses: docker/build-push-action@v2
      with:
        tags: my-registry/my-app:latest
        push: true

八、常见问题解答

Q1:如何查看运行时配置?
访问Spring Actuator端点:

curl http://localhost:8080/actuator/env

Q2:前端修改后需要重新构建整个镜像吗?
是的,但可以通过优化构建层加快速度:

# 在frontend阶段添加缓存优化
RUN npm install --prefer-offline --frozen-lockfile

Q3:如何限制容器资源?
运行时添加参数:

docker run -d --memory=1g --cpus=2 my-app:v1

九、总结

通过本文你已掌握:

  • 前后端项目整合技巧 ✅
  • Docker多阶段构建优化 ✅
  • 动态配置管理方案 ✅
  • 生产级部署最佳实践 ✅

现在立即动手,把你的项目容器化吧!如果遇到问题,欢迎在评论区留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿谷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值