基于Docker Compose与Nginx反向代理:一站式部署SpringBoot+Vue分离架构实践
1. 为什么需要Docker Compose与Nginx反向代理在前后端分离架构中后端通常使用SpringBoot提供RESTful API前端使用Vue构建单页应用。传统部署方式需要分别配置服务器环境、安装依赖、手动启动服务过程繁琐且容易出错。我在实际项目中遇到过多次因环境不一致导致的在我机器上能跑的问题。Docker Compose的妙处在于能用YAML文件定义整个服务栈。比如一个典型的电商系统需要后端Java服务SpringBoot前端Web服务Vue打包产物数据库MySQL缓存Redis反向代理Nginx以前需要手动启动这些服务现在只需一个docker-compose up -d命令。Nginx作为反向代理的核心作用有三点将前端静态文件请求如/index.html导向Vue打包产物将/api开头的请求转发到SpringBoot后端提供HTTPS支持、负载均衡等进阶能力实测下来这种方案比传统部署效率提升至少70%。最近帮朋友迁移老项目时原本需要2天的部署工作用Docker Compose只用了2小时就完成了全栈部署。2. 环境准备与工具安装2.1 Docker引擎安装以CentOS 7为例安装Docker CE最新版# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装引擎 sudo yum install docker-ce docker-ce-cli containerd.io # 启动服务 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version常见踩坑点企业内网可能需要配置代理某些云厂商的镜像源需要特殊配置非root用户要加入docker用户组2.2 Docker Compose安装推荐使用官方二进制方式安装# 下载最新版(替换2.23.3为当前最新版本) sudo curl -L https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version我在阿里云ECS上实测时发现如果直接使用yum安装的版本可能过旧会导致某些新特性不可用。建议总是使用官方最新稳定版。3. 项目结构与Docker化改造3.1 后端SpringBoot改造标准的SpringBoot项目需要添加Dockerfile# 使用官方OpenJDK镜像 FROM eclipse-temurin:17-jdk-jammy # 设置工作目录 WORKDIR /app # 复制构建产物 COPY target/*.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT [java, -jar, app.jar]关键注意事项JDK版本要与开发环境一致镜像标签不要用latest应该用具体版本号生产环境建议添加JVM参数优化内存使用3.2 前端Vue改造Vue项目需要调整vue.config.jsmodule.exports { publicPath: process.env.NODE_ENV production ? / : /, outputDir: dist, devServer: { proxy: { /api: { target: http://backend:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } }打包时需要特别注意静态资源路径要使用相对路径API地址要配置为Nginx反向代理路径建议开启gzip压缩减少体积4. Docker Compose编排实战4.1 编写docker-compose.yml完整示例version: 3.8 services: backend: build: context: ./backend dockerfile: Dockerfile ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEprod - DB_URLjdbc:mysql://mysql:3306/app_db - REDIS_HOSTredis depends_on: - mysql - redis frontend: image: nginx:alpine ports: - 80:80 volumes: - ./frontend/dist:/usr/share/nginx/html - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - backend mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORDrootpass - MYSQL_DATABASEapp_db - MYSQL_USERapp_user - MYSQL_PASSWORDuserpass volumes: - mysql_data:/var/lib/mysql redis: image: redis:alpine ports: - 6379:6379 volumes: mysql_data:关键配置解析使用version 3.8语法支持最新特性backend服务通过build指令构建镜像环境变量统一管理敏感配置数据卷持久化MySQL数据depends_on控制启动顺序4.2 Nginx反向代理配置在nginx/conf.d/default.conf中server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这个配置实现了静态资源直接返回前端文件/api请求转发到后端服务保留了客户端真实IP支持前端路由的history模式5. 部署与运维实践5.1 一键启动与停止启动整个服务栈docker-compose up -d --build停止服务并清理docker-compose down查看日志docker-compose logs -f backend5.2 生产环境优化建议镜像优化使用多阶段构建减少镜像体积选择alpine等轻量级基础镜像合并RUN指令减少镜像层数安全加固使用非root用户运行容器定期更新基础镜像配置网络隔离性能调优调整Nginx worker进程数配置Redis最大内存限制优化MySQL缓冲池大小5.3 常见问题排查问题1前端访问接口404检查Nginx配置中的proxy_pass地址确认后端服务健康状态查看docker-compose网络配置问题2数据库连接失败检查MySQL容器是否正常启动验证连接字符串中的服务名查看数据库日志确认权限问题3静态资源加载异常确认dist目录挂载路径正确检查Nginx root配置查看文件权限是否正确这套方案在我经手的多个项目中表现稳定包括日活10万的电商系统。最大的优势是开发、测试、生产环境完全一致再也不会出现本地正常线上挂的情况。对于需要快速迭代的项目这种部署方式能节省大量运维成本。