Spring Boot与Vue项目容器化部署实战指南

发布时间:2026/7/26 9:37:07
Spring Boot与Vue项目容器化部署实战指南 1. 项目背景与核心价值去年接手的一个企业级应用改造项目让我深刻体会到容器化部署对现代Web应用的重要性。当时客户要求将原有单体架构的Java应用拆分为前后端分离架构同时实现快速部署和弹性伸缩。经过技术选型最终采用Spring Boot Vue的组合并用Docker实现环境标准化。这种技术栈现在已经成为中大型Web项目的标配方案。把Spring Boot和Vue项目打包成Docker镜像的核心优势在于环境一致性。我遇到过太多在我本地是好的这类问题——开发用Mac、测试用Windows、生产环境是CentOS各种依赖版本差异导致的问题层出不穷。容器化后我们只需要确保Docker能运行就再也不用担心环境差异问题。2. 环境准备与工具选型2.1 基础环境配置在开始之前我们需要准备以下环境以Linux系统为例# 安装Docker sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 验证安装 docker --version docker run hello-world注意生产环境建议使用Docker 20.10版本对资源限制和日志管理有重要改进。我在AWS EC2上实测发现新版本对内存泄漏的处理更完善。2.2 前端项目准备Vue项目需要特别注意的点修改vue.config.js确保静态资源路径正确module.exports { publicPath: process.env.NODE_ENV production ? /static/ : /, outputDir: dist, assetsDir: static }推荐使用多阶段构建减小镜像体积。这是我优化过的一个Dockerfile示例# 构建阶段 FROM node:16-alpine as build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 生产阶段 FROM nginx:stable-alpine as production-stage COPY --frombuild-stage /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD [nginx, -g, daemon off;]2.3 后端项目配置Spring Boot项目需要特别注意数据库连接等配置的容器化适配application.properties应该支持环境变量注入spring.datasource.url${DB_URL:jdbc:mysql://localhost:3306/appdb} spring.datasource.username${DB_USER} spring.datasource.password${DB_PASSWORD}推荐使用官方的openjdk镜像作为基础这是我验证过的高效DockerfileFROM openjdk:11-jre-slim VOLUME /tmp ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT [java,-jar,/app.jar]3. 容器化部署实战3.1 构建与运行单个服务前端构建命令docker build -t vue-app . docker run -d -p 8080:80 --name vue-container vue-app后端构建特别注意# 先打包Spring Boot项目 mvn clean package # 然后构建镜像 docker build -t springboot-app . # 运行时要链接数据库容器 docker run -d -p 8081:8080 \ -e DB_URLjdbc:mysql://mysql-container:3306/appdb \ -e DB_USERroot \ -e DB_PASSWORDsecret \ --name springboot-container \ springboot-app3.2 使用Docker Compose编排对于生产环境强烈建议使用docker-compose.yml来管理多容器应用version: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: appdb volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 backend: build: ./backend depends_on: - mysql environment: DB_URL: jdbc:mysql://mysql:3306/appdb DB_USER: root DB_PASSWORD: secret ports: - 8080:8080 frontend: build: ./frontend ports: - 80:80 volumes: mysql_data:启动命令docker-compose up -d4. 性能优化与生产建议4.1 镜像瘦身技巧使用.alpine基础镜像可以显著减小体积。比如node:16-alpine只有约110MB而常规node镜像超过900MB。多阶段构建是必须的前端构建后只需要nginx服务静态文件不需要保留node_modules。对于Java应用使用jre而不是jdk作为运行时镜像可以节省约200MB空间。4.2 资源限制配置生产环境必须配置资源限制避免单个容器耗尽主机资源services: backend: deploy: resources: limits: cpus: 2 memory: 1G reservations: memory: 512M4.3 日志管理方案推荐两种日志处理方式挂载宿主机目录services: backend: volumes: - /var/log/app:/app/logs使用logging driver适合集群环境services: backend: logging: driver: json-file options: max-size: 10m max-file: 35. 常见问题排查5.1 跨域问题处理前后端分离部署最常见的跨域问题解决方案开发环境配置vue-cli代理// vue.config.js devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }生产环境Nginx配置反向代理location /api { proxy_pass http://backend:8080; proxy_set_header Host $host; }5.2 容器时区问题容器默认使用UTC时区解决方法# 前端方案 FROM nginx:alpine RUN apk add tzdata \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ echo Asia/Shanghai /etc/timezone # Java方案 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone5.3 内存溢出处理Java应用常见的内存问题可以通过JVM参数调整ENTRYPOINT [java,-Xms512m,-Xmx1024m,-XX:UseG1GC,-jar,/app.jar]6. 进阶部署方案6.1 使用Docker Swarm集群对于需要高可用的生产环境可以初始化Swarm集群docker swarm init docker stack deploy -c docker-compose.yml myapp6.2 结合CI/CD流程典型的GitLab CI配置示例stages: - build - deploy build_frontend: stage: build script: - docker build -t registry.example.com/vue-app:$CI_COMMIT_SHA ./frontend - docker push registry.example.com/vue-app:$CI_COMMIT_SHA deploy_prod: stage: deploy script: - ssh userserver docker pull registry.example.com/vue-app:$CI_COMMIT_SHA - ssh userserver docker-compose -f /opt/app/docker-compose.yml up -d6.3 监控方案配置推荐使用Prometheus Grafana监控容器在docker-compose中添加services: prometheus: image: prom/prometheus ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: - 3000:3000配置Spring Boot暴露metrics端点management.endpoints.web.exposure.includehealth,info,metrics,prometheus在实际项目中我通常会根据团队的技术栈选择最适合的部署方案。对于中小型项目Docker Compose已经足够当需要弹性伸缩时Kubernetes是更好的选择但学习曲线会更陡峭。无论哪种方案容器化都能显著提升部署效率和系统稳定性。