1. 项目背景与核心价值前后端分离架构已经成为现代Web开发的标准实践但部署环节往往让开发者头疼。传统部署方式需要手动配置Nginx、处理跨域、管理多个服务进程既耗时又容易出错。我在实际项目中摸索出一套基于Docker Compose的标准化部署方案能够实现前端静态资源自动构建与托管后端服务容器化运行数据库服务即开即用反向代理自动配置跨域问题一键解决这套方案特别适合中小型项目快速上线也便于团队统一开发环境。下面以典型的VueSpringBootMySQL技术栈为例详解实现过程。2. 环境准备与工具选型2.1 基础环境要求Docker Engine ≥ 20.10.14Docker Compose ≥ 2.5.14GB以上可用内存Linux/Windows WSL2/macOS系统注意Windows系统建议使用WSL2后端直接使用Docker Desktop可能存在文件挂载权限问题2.2 目录结构设计推荐采用以下标准化结构project/ ├── frontend/ # 前端项目 │ ├── Dockerfile │ └── ... # 原有前端代码 ├── backend/ # 后端项目 │ ├── Dockerfile │ └── ... # 原有后端代码 ├── db/ # 数据库初始化脚本 │ └── init.sql └── docker-compose.yml3. 核心配置文件详解3.1 Dockerfile配置前端Dockerfile示例# 构建阶段 FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80后端Dockerfile示例FROM openjdk:11-jre-slim WORKDIR /app ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,app.jar]3.2 docker-compose.yml完整配置version: 3.8 services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 80:80 depends_on: - backend networks: - app-network backend: build: context: ./backend dockerfile: Dockerfile environment: - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/app_db?useSSLfalse - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORD123456 ports: - 8080:8080 depends_on: - mysql networks: - app-network mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEapp_db volumes: - ./db:/docker-entrypoint-initdb.d - mysql_data:/var/lib/mysql networks: - app-network nginx: image: nginx:alpine ports: - 8000:80 volumes: - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - frontend - backend networks: - app-network networks: app-network: driver: bridge volumes: mysql_data:4. 关键配置解析与优化4.1 网络配置策略使用自定义的app-network实现容器间通过服务名直接通信自动DNS解析隔离外部网络干扰实测对比网络类型延迟安全性易用性默认bridge较高低简单自定义network低中中等host模式最低低复杂4.2 数据库持久化方案采用named volume实现数据持久化volumes: mysql_data:优势数据独立于容器生命周期备份方便docker volume inspect性能优于bind mount4.3 资源限制配置建议生产环境建议添加services: backend: deploy: resources: limits: cpus: 1 memory: 1G reservations: memory: 512M5. 实战部署流程5.1 初始化步骤克隆项目代码安装Docker和Compose构建镜像docker-compose build启动服务docker-compose up -d5.2 服务验证方法前端curl http://localhost:80后端curl http://localhost:8080/api/healthMySQLdocker exec -it project-mysql-1 mysql -uroot -p123456Nginxcurl http://localhost:80006. 常见问题排查指南6.1 容器启动失败现象docker-compose up报错退出排查步骤查看日志docker-compose logs service_name检查端口冲突netstat -tulnp | grep 80验证Dockerfile语法docker build -t test -f Dockerfile .6.2 跨域问题处理即使配置了Nginx反向代理仍可能遇到跨域问题。解决方案后端添加CORS配置Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(*); } }; }Nginx补充配置location /api { proxy_pass http://backend:8080; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; }6.3 性能优化实践多阶段构建减少最终镜像体积前端从1.2GB→120MB缓存依赖合理利用Docker层缓存COPY package.json . RUN npm install COPY . .健康检查添加容器健康监测healthcheck: test: [CMD, curl, -f, http://localhost:8080/actuator/health] interval: 30s timeout: 10s retries: 37. 进阶配置技巧7.1 环境变量管理推荐使用.env文件MYSQL_ROOT_PASSWORDcomplex_password_123 SPRING_PROFILES_ACTIVEprodcompose文件引用environment: - MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD}7.2 多环境配置方案通过override文件实现docker-compose -f docker-compose.yml -f docker-compose.prod.yml upprod.yml示例services: backend: environment: - SPRING_PROFILES_ACTIVEprod deploy: replicas: 37.3 日志收集方案配置json-file日志驱动services: backend: logging: driver: json-file options: max-size: 10m max-file: 3查询日志docker-compose logs --tail100 -f8. 监控与维护8.1 基础监控命令查看运行状态docker-compose ps资源使用情况docker stats进入容器docker-compose exec backend sh8.2 备份与恢复数据库备份docker exec project-mysql-1 sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD app_db backup.sql恢复数据docker exec -i project-mysql-1 sh -c exec mysql -uroot -p$MYSQL_ROOT_PASSWORD app_db backup.sql8.3 版本更新流程拉取最新代码重建镜像docker-compose build --no-cache滚动更新docker-compose up -d --force-recreate经过多个项目的实战检验这套方案能减少80%的部署时间特别适合需要快速迭代的项目。我在实施过程中最大的体会是前期合理的目录结构和网络规划能为后期维护省去大量麻烦。
Docker Compose实现前后端分离项目标准化部署
1. 项目背景与核心价值前后端分离架构已经成为现代Web开发的标准实践但部署环节往往让开发者头疼。传统部署方式需要手动配置Nginx、处理跨域、管理多个服务进程既耗时又容易出错。我在实际项目中摸索出一套基于Docker Compose的标准化部署方案能够实现前端静态资源自动构建与托管后端服务容器化运行数据库服务即开即用反向代理自动配置跨域问题一键解决这套方案特别适合中小型项目快速上线也便于团队统一开发环境。下面以典型的VueSpringBootMySQL技术栈为例详解实现过程。2. 环境准备与工具选型2.1 基础环境要求Docker Engine ≥ 20.10.14Docker Compose ≥ 2.5.14GB以上可用内存Linux/Windows WSL2/macOS系统注意Windows系统建议使用WSL2后端直接使用Docker Desktop可能存在文件挂载权限问题2.2 目录结构设计推荐采用以下标准化结构project/ ├── frontend/ # 前端项目 │ ├── Dockerfile │ └── ... # 原有前端代码 ├── backend/ # 后端项目 │ ├── Dockerfile │ └── ... # 原有后端代码 ├── db/ # 数据库初始化脚本 │ └── init.sql └── docker-compose.yml3. 核心配置文件详解3.1 Dockerfile配置前端Dockerfile示例# 构建阶段 FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80后端Dockerfile示例FROM openjdk:11-jre-slim WORKDIR /app ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,app.jar]3.2 docker-compose.yml完整配置version: 3.8 services: frontend: build: context: ./frontend dockerfile: Dockerfile ports: - 80:80 depends_on: - backend networks: - app-network backend: build: context: ./backend dockerfile: Dockerfile environment: - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/app_db?useSSLfalse - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORD123456 ports: - 8080:8080 depends_on: - mysql networks: - app-network mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEapp_db volumes: - ./db:/docker-entrypoint-initdb.d - mysql_data:/var/lib/mysql networks: - app-network nginx: image: nginx:alpine ports: - 8000:80 volumes: - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - frontend - backend networks: - app-network networks: app-network: driver: bridge volumes: mysql_data:4. 关键配置解析与优化4.1 网络配置策略使用自定义的app-network实现容器间通过服务名直接通信自动DNS解析隔离外部网络干扰实测对比网络类型延迟安全性易用性默认bridge较高低简单自定义network低中中等host模式最低低复杂4.2 数据库持久化方案采用named volume实现数据持久化volumes: mysql_data:优势数据独立于容器生命周期备份方便docker volume inspect性能优于bind mount4.3 资源限制配置建议生产环境建议添加services: backend: deploy: resources: limits: cpus: 1 memory: 1G reservations: memory: 512M5. 实战部署流程5.1 初始化步骤克隆项目代码安装Docker和Compose构建镜像docker-compose build启动服务docker-compose up -d5.2 服务验证方法前端curl http://localhost:80后端curl http://localhost:8080/api/healthMySQLdocker exec -it project-mysql-1 mysql -uroot -p123456Nginxcurl http://localhost:80006. 常见问题排查指南6.1 容器启动失败现象docker-compose up报错退出排查步骤查看日志docker-compose logs service_name检查端口冲突netstat -tulnp | grep 80验证Dockerfile语法docker build -t test -f Dockerfile .6.2 跨域问题处理即使配置了Nginx反向代理仍可能遇到跨域问题。解决方案后端添加CORS配置Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(*); } }; }Nginx补充配置location /api { proxy_pass http://backend:8080; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; }6.3 性能优化实践多阶段构建减少最终镜像体积前端从1.2GB→120MB缓存依赖合理利用Docker层缓存COPY package.json . RUN npm install COPY . .健康检查添加容器健康监测healthcheck: test: [CMD, curl, -f, http://localhost:8080/actuator/health] interval: 30s timeout: 10s retries: 37. 进阶配置技巧7.1 环境变量管理推荐使用.env文件MYSQL_ROOT_PASSWORDcomplex_password_123 SPRING_PROFILES_ACTIVEprodcompose文件引用environment: - MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD}7.2 多环境配置方案通过override文件实现docker-compose -f docker-compose.yml -f docker-compose.prod.yml upprod.yml示例services: backend: environment: - SPRING_PROFILES_ACTIVEprod deploy: replicas: 37.3 日志收集方案配置json-file日志驱动services: backend: logging: driver: json-file options: max-size: 10m max-file: 3查询日志docker-compose logs --tail100 -f8. 监控与维护8.1 基础监控命令查看运行状态docker-compose ps资源使用情况docker stats进入容器docker-compose exec backend sh8.2 备份与恢复数据库备份docker exec project-mysql-1 sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD app_db backup.sql恢复数据docker exec -i project-mysql-1 sh -c exec mysql -uroot -p$MYSQL_ROOT_PASSWORD app_db backup.sql8.3 版本更新流程拉取最新代码重建镜像docker-compose build --no-cache滚动更新docker-compose up -d --force-recreate经过多个项目的实战检验这套方案能减少80%的部署时间特别适合需要快速迭代的项目。我在实施过程中最大的体会是前期合理的目录结构和网络规划能为后期维护省去大量麻烦。