Docker Compose企业实战系列(三):Vue/React前端项目容器化完整部署

Docker Compose企业实战系列(三):Vue/React前端项目容器化完整部署

前言

前面两篇我们搞定了LNMP建站环境 、SpringBoot+MySQL+Redis后端部署。

一套完整的项目还差最后一块:前端容器化。

传统前端部署坑非常多:打包路径问题、刷新404、跨域、部署环境不一致、每次上传文件麻烦。

本篇给你企业通用、全站可复制、零修改即用的 Vue/React 容器化方案:

基于 Nginx 部署静态资源、自动代理后端接口、解决 history 路由404、和 SpringBoot 后端统一 Compose 编排,实现前后端一键上线。

一、整套项目最终目录结构

和上一篇后端项目完美衔接,目录统一规范:

plain 复制代码
full-stack-docker/
├── .env
├── docker-compose.yml      # 全局编排文件
├── app/                    # SpringBoot后端
│   ├── Dockerfile
│   └── app.jar
└── web/                    # Vue/React前端
    ├── Dockerfile
    ├── nginx.conf
    └── dist/               # 前端打包产物

二、前端 Nginx 配置(解决404+跨域代理)

新建 web/nginx.conf,直接全量复制,已适配 Vue/React history 模式:

nginx 复制代码
server {
    listen 80;
    server_name localhost;

    # 静态资源根目录
    root /usr/share/nginx/html;
    index index.html;

    # 解决前端history路由刷新404
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 所有/api请求转发到后端SpringBoot服务
    # 重点:springboot-service 是compose中的后端服务名
    location /api/ {
        proxy_pass http://springboot-service:8080/api/;
        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;
    }
}

三、前端通用 Dockerfile

新建 web/Dockerfile,轻量 Nginx 镜像,生产通用模板:

dockerfile 复制代码
# 轻量nginx基础镜像
FROM nginx:alpine

# 删除默认配置
RUN rm /etc/nginx/conf.d/default.conf

# 拷贝自定义nginx配置
COPY nginx.conf /etc/nginx/conf.d/

# 拷贝前端打包产物
COPY dist /usr/share/nginx/html

# 暴露80端口
EXPOSE 80

# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

四、环境变量 .env 文件

沿用后端配置,统一管理:

env 复制代码
# MySQL
MYSQL_ROOT_PASSWORD=root123456
MYSQL_DATABASE=spring_db
MYSQL_USER=appuser
MYSQL_PASSWORD=app123456

# Redis
REDIS_PASSWORD=redis123456

# 镜像版本
MYSQL_VERSION=8.0
REDIS_VERSION=7.0-alpine

五、完整版 docker-compose.yml(前后端全套)

终极整合版,包含:前端+后端+MySQL+Redis,直接复制即用:

yaml 复制代码
version: '3.8'

services:
  # MySQL
  mysql:
    image: mysql:${MYSQL_VERSION}
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: always
    networks:
      - full-net

  # Redis
  redis:
    image: redis:${REDIS_VERSION}
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
    restart: always
    networks:
      - full-net

  # SpringBoot后端
  springboot-service:
    build: ./app
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redis
    restart: always
    networks:
      - full-net

  # Vue/React前端
  web:
    build: ./web
    ports:
      - "80:80"
    depends_on:
      - springboot-service
    restart: always
    networks:
      - full-net

# 统一自定义网络,容器名互访
networks:
  full-net:
    driver: bridge

六、后端 app/Dockerfile(复用完整版)

dockerfile 复制代码
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

七、前端项目打包关键配置(必看)

1. Vite 项目新增打包路径

vite.config.js

javascript 复制代码
export default defineConfig({
  base: "./",
  // 其他配置...
})

2. 打包命令

bash 复制代码
npm run build

打包完成,将 dist 文件夹放入 web/ 目录。

八、一键部署全套前后端项目

进入项目根目录执行:

bash 复制代码
# 构建镜像 + 后台启动全部服务
docker compose up -d --build

# 查看运行状态
docker compose ps

# 实时查看日志
docker compose logs -f

九、访问地址

  • 前端页面:http://服务器IP

  • 后端接口:http://IP:8080

十、高频踩坑总结(已帮你避坑)

  • 页面刷新404:已在 nginx.conf 配置 try_files 兜底

  • 前端跨域报错:通过 Nginx 代理,彻底解决跨域

  • 接口连不上后端:同一 compose 网络,使用服务名通信,无需IP

  • 更新前端不生效 :必须重新 build + 重新构建镜像 --build

  • 页面空白 :Vite 打包必须配置 base: "./" 相对路径

本期总结

本期我们完成了 Vue/React前端 + SpringBoot后端 + MySQL + Redis 全站容器化部署。

至此:完整前后端分离项目,实现一行命令部署、环境统一、开箱即用,完全满足毕业设计、个人项目、中小企业上线需求。

下期预告

Docker Compose企业实战系列(四):Redis持久化、密码配置与集群实战

详解 Redis 生产级部署、持久化策略、密码安全、防止缓存数据丢失。

相关推荐
子兮曰1 小时前
PHP漏洞危机,你的网站升级了吗?
前端·后端·php
jerrywus1 小时前
给 Pi 装上生图插件:从登录报错到画出一只 200×200 的猫
前端·agent·claude
陈随易1 小时前
搞钱点子之生态鱼缸
前端·后端·程序员
PBitW1 小时前
从空目录到上线:我全程用 TRAE 做了一款微信小游戏合集(含一次完整架构重构)
前端·trae
不爱学英文的码字机器1 小时前
从Q1迁到T1,同一个编号已经换了含义
前端·数据库·microsoft
云和数据.ChenGuang2 小时前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain
avi91112 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
fengci.2 小时前
BUUCTF(困难部分)
android·开发语言·前端·学习·php
Ward的AI产品实战2 小时前
开源 AI 网关 Magpie 调优终结篇:顺位排错、跨家族对抗审查与 5 大路由组重构(下篇)
前端·人工智能
Highcharts.js2 小时前
BI可视化图表“维护难”问题的解决方案
开发语言·前端·javascript·编辑器·ecmascript·bi·highcharts