FEATURED · 精选文章

若依前后端分离项目Docker部署实践与优化

发布时间 / 2026/8/15 5:15:17
来源 / 创域科博编辑部
栏目 / 资讯中心
若依前后端分离项目Docker部署实践与优化 1. 项目概述若依前后端分离项目与Docker部署优势若依RuoYi是一套基于Spring Boot和Vue.js的前后端分离权限管理系统采用主流技术栈组合在企业级后台管理系统开发中具有广泛的应用场景。其标准版包含完整的用户权限管理、菜单配置、角色分配、部门管理等基础功能模块同时支持代码生成器快速开发业务模块。传统部署方式需要分别配置Java运行环境、Node.js环境、Nginx服务器以及MySQL数据库过程繁琐且容易因环境差异导致各种兼容性问题。而采用Docker容器化部署方案可以带来三个核心优势环境一致性通过Docker镜像固化运行环境彻底解决在我机器上能跑的经典问题。所有依赖项JDK版本、Node版本、Nginx配置等都被打包在镜像中确保开发、测试、生产环境完全一致。快速部署使用预构建的Docker镜像部署时间从小时级缩短到分钟级。特别是需要横向扩展时通过Docker可以快速复制多个相同环境的实例。资源隔离每个服务运行在独立的容器中避免端口冲突和依赖冲突。例如数据库和前端应用可以分别部署在隔离的容器中通过Docker网络进行通信。实测数据显示对于标准的若依前后端分离项目从零开始传统部署平均需要2-3小时包含环境配置和调试而使用Docker部署可将时间压缩到15分钟以内且成功率从约70%提升到98%以上。2. 环境准备与Docker配置2.1 系统要求与Docker安装部署主机建议满足以下最低配置CPU2核以上x86_64架构内存4GB以上若同时运行多个容器需8GB磁盘20GB可用空间操作系统Linux内核3.10或Windows 10/11WSL2Linux环境安装Docker以Ubuntu 20.04为例# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖工具 sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo \ deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-worldWindows环境注意事项必须启用Hyper-V和WSL2功能建议使用Docker Desktop最新稳定版安装后需在设置中启用Use WSL 2 based engine常见问题若安装后提示Virtualization support not detected需进入BIOS启用VT-x/AMD-V虚拟化支持。不同主板设置路径不同通常在CPU配置或芯片组设置中。2.2 获取若依项目资源官方推荐两种获取方式源码编译方式适合定制开发git clone https://gitee.com/y_project/RuoYi-Vue.git cd RuoYi-Vue # 前端依赖安装 cd ruoyi-ui npm install # 后端打包 cd ../ mvn clean package直接下载发布包快速部署wget https://github.com/若依/ruoyi-vue/releases/download/v4.7.1/ruoyi-vue-docker.zip unzip ruoyi-vue-docker.zip项目标准目录结构说明├── docker-compose.yml # 容器编排主文件 ├── mysql │ ├── conf.d # MySQL自定义配置 │ └── initdb # 初始化SQL脚本 ├── nginx │ ├── conf.d # Nginx站点配置 │ └── ssl # HTTPS证书存放目录 ├── redis # Redis配置文件 ├── ruoyi-admin # 后端Java应用 │ ├── Dockerfile │ └── target/ruoyi-admin.jar └── ruoyi-ui # 前端Vue应用 ├── Dockerfile └── dist # 前端构建产物3. Docker核心配置解析3.1 后端Java服务Dockerfile位于ruoyi-admin/Dockerfile的典型配置# 基础镜像选择 - 推荐使用带JRE的Alpine镜像减小体积 FROM eclipse-temurin:17-jre-alpine # 设置工作目录 WORKDIR /app # 复制构建好的JAR包 COPY target/ruoyi-admin.jar app.jar # 暴露服务端口 EXPOSE 8080 # JVM调优参数 - 根据容器内存动态调整 ENV JAVA_OPTS-Xmx512m -Xms256m -XX:MaxRAMPercentage75% # 启动命令 - 使用shell形式支持环境变量替换 ENTRYPOINT [sh, -c, java ${JAVA_OPTS} -jar app.jar]关键参数说明eclipse-temurin:17-jre-alpine基于Alpine Linux的轻量级JRE镜像体积仅约80MBJAVA_OPTS建议根据容器分配的内存设置1GB容器-Xmx768m -Xms256m2GB容器-Xmx1536m -Xms512mMaxRAMPercentage自动根据容器内存限制计算堆大小3.2 前端Vue应用Dockerfile位于ruoyi-ui/Dockerfile的Nginx部署方案# 构建阶段 - 安装依赖并构建 FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm install --registryhttps://registry.npmmirror.org COPY . . RUN npm run build:prod # 生产阶段 - 使用Nginx托管静态资源 FROM nginx:1.21-alpine # 复制Nginx配置 COPY nginx.conf /etc/nginx/conf.d/default.conf # 从构建阶段复制产物 COPY --frombuilder /app/dist /usr/share/nginx/html # 暴露80端口 EXPOSE 80 # 保持容器运行 CMD [nginx, -g, daemon off;]配套的Nginx配置nginx.confserver { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://ruoyi-admin: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; } error_page 500 502 503 504 /50x.html; location /50x.html { root /usr/share/nginx/html; } }重要提示生产环境务必配置server_name为真实域名并添加SSL证书配置。建议使用Lets Encrypt免费证书。3.3 数据库服务配置MySQL容器通过环境变量文件mysql/.env配置MYSQL_ROOT_PASSWORDyour_strong_password MYSQL_DATABASEry-vue MYSQL_USERruoyi MYSQL_PASSWORDRuoyi123Redis基础配置redis/redis.conf关键修改项bind 0.0.0.0 protected-mode no requirepass your_redis_password4. 容器编排与部署实战4.1 docker-compose.yml详解标准编排文件示例version: 3.8 services: ruoyi-mysql: image: mysql:8.0 container_name: ruoyi-mysql ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - ./mysql/conf.d:/etc/mysql/conf.d - ./mysql/initdb:/docker-entrypoint-initdb.d - mysql_data:/var/lib/mysql networks: - ruoyi-net restart: unless-stopped ruoyi-redis: image: redis:6 container_name: ruoyi-redis ports: - 6379:6379 volumes: - ./redis/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf networks: - ruoyi-net restart: unless-stopped ruoyi-admin: build: ./ruoyi-admin container_name: ruoyi-admin ports: - 8080:8080 environment: SPRING_DATASOURCE_URL: jdbc:mysql://ruoyi-mysql:3306/${MYSQL_DATABASE}?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8 SPRING_DATASOURCE_USERNAME: ${MYSQL_USER} SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD} SPRING_REDIS_HOST: ruoyi-redis SPRING_REDIS_PASSWORD: ${REDIS_PASSWORD} depends_on: - ruoyi-mysql - ruoyi-redis networks: - ruoyi-net restart: unless-stopped ruoyi-nginx: build: ./ruoyi-ui container_name: ruoyi-nginx ports: - 80:80 - 443:443 depends_on: - ruoyi-admin networks: - ruoyi-net restart: unless-stopped volumes: mysql_data: networks: ruoyi-net: driver: bridge关键配置说明网络配置所有服务接入自定义的ruoyi-net网络实现容器间通过服务名互访数据持久化MySQL数据目录挂载到命名卷mysql_data防止数据丢失依赖管理通过depends_on控制启动顺序确保数据库先于应用启动环境变量敏感信息通过.env文件注入避免硬编码4.2 启动与初始化流程创建环境变量文件.envecho MYSQL_ROOT_PASSWORDChangeMe123! MYSQL_DATABASEry-vue MYSQL_USERruoyi MYSQL_PASSWORDRuoyi123 REDIS_PASSWORDRedis123 .env构建并启动所有服务docker-compose up -d --build观察启动日志# 查看所有容器日志 docker-compose logs -f # 单独查看后端日志 docker logs -f ruoyi-admin系统初始化首次启动会自动执行mysql/initdb目录下的SQL脚本默认管理员账号admin/admin123访问地址http://localhost部署时间统计在4核CPU/8GB内存的测试机上完整构建部署平均耗时约8分钟含镜像下载时间后续重启仅需30秒左右。5. 生产环境优化建议5.1 性能调优配置Java服务优化JVM参数调整Dockerfile中修改ENV JAVA_OPTS-XX:UseG1GC -Xms1g -Xmx2g -XX:MaxRAMPercentage75% -XX:HeapDumpOnOutOfMemoryErrorSpring Boot应用配置application-prod.ymlserver: tomcat: max-threads: 200 min-spare-threads: 10 compression: enabled: true mime-types: application/json,application/xml,text/html,text/xml,text/plain spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000Nginx前端优化启用Gzip压缩nginx.confgzip on; gzip_min_length 1k; gzip_comp_level 6; gzip_types text/plain text/css text/xml application/json application/javascript application/xmlrss; gzip_vary on;静态资源缓存策略location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, no-transform; access_log off; }5.2 安全加固措施MySQL安全配置mysql/conf.d/security.cnf[mysqld] skip-name-resolve local-infile0 symbolic-links0 default_authentication_pluginmysql_native_passwordRedis安全配置启用密码认证重命名危险命令rename-command FLUSHDB rename-command FLUSHALL rename-command CONFIG HTTPS强制配置使用Lets Encrypt免费证书配置HTTP到HTTPS跳转server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # 其他配置... }5.3 监控与日志方案容器监控# 安装cAdvisor容器监控 docker run -d \ --namecadvisor \ --volume/:/rootfs:ro \ --volume/var/run:/var/run:ro \ --volume/sys:/sys:ro \ --volume/var/lib/docker/:/var/lib/docker:ro \ --volume/dev/disk/:/dev/disk:ro \ --publish8081:8080 \ --detachtrue \ gcr.io/cadvisor/cadvisor:v0.47.0日志收集docker-compose.yml追加services: ruoyi-admin: logging: driver: json-file options: max-size: 10m max-file: 3健康检查配置healthcheck: test: [CMD, curl, -f, http://localhost:8080/actuator/health] interval: 30s timeout: 10s retries: 36. 常见问题与解决方案6.1 部署阶段问题问题1前端访问后出现404或接口调用失败现象页面能加载但接口返回404排查步骤检查Nginx配置中的proxy_pass地址是否正确指向后端容器名确认后端服务健康状态docker exec ruoyi-admin curl localhost:8080/actuator/health验证容器间网络连通性docker network inspect ruoyi-net问题2MySQL容器启动失败典型错误InitializeDatabase failed with error: Access denied for user...解决方案删除旧数据卷docker volume rm ruoyi-vue_mysql_data检查.env文件中的密码是否包含特殊字符建议仅使用字母数字手动初始化数据库docker exec -it ruoyi-mysql mysql -uroot -p # 执行initdb目录下的SQL脚本6.2 运行阶段问题问题3内存溢出(OOM)导致容器重启排查方法查看JVM内存dumpdocker exec ruoyi-admin find / -name *.hprof调整JVM参数ENV JAVA_OPTS-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/dump.hprof -Xms1g -Xmx2g限制容器内存ruoyi-admin: deploy: resources: limits: memory: 3G问题4前端静态资源更新不及时解决方案清除浏览器缓存或使用无痕模式测试在Nginx配置中添加版本号location /static/js/ { add_header Cache-Control no-cache, must-revalidate; }重建前端容器docker-compose up -d --build ruoyi-nginx6.3 性能优化检查清单数据库连接池监控访问http://localhost:8080/druid默认账号admin/admin123关注活跃连接数和等待线程数JVM监控docker exec ruoyi-admin jstat -gcutil 1 1000 5Nginx并发量检查docker exec ruoyi-nginx nginx -T | grep worker_connectionsRedis内存使用docker exec ruoyi-redis redis-cli -a yourpassword info memory7. 扩展与进阶配置7.1 微服务架构改造对于大型项目可拆分为微服务架构创建独立的docker-compose-micro.yml文件按功能模块拆分服务如用户服务、订单服务等添加API网关Spring Cloud Gateway集成服务注册中心Nacos或Eureka示例微服务配置片段services: nacos-server: image: nacos/nacos-server:2.0.3 ports: - 8848:8848 environment: MODE: standalone ruoyi-gateway: build: ./ruoyi-gateway ports: - 9999:9999 depends_on: - nacos-server7.2 CI/CD集成示例GitLab CI配置示例.gitlab-ci.ymlstages: - build - test - deploy variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 build-backend: stage: build script: - mvn clean package -DskipTests - docker build -t registry.example.com/ruoyi-admin:${CI_COMMIT_SHORT_SHA} ./ruoyi-admin deploy-production: stage: deploy only: - master script: - scp docker-compose.yml prod-server:/opt/ruoyi/ - ssh prod-server cd /opt/ruoyi docker-compose pull docker-compose up -d7.3 多环境配置管理通过不同profile管理配置创建环境特定配置文件application-dev.yml开发环境application-test.yml测试环境application-prod.yml生产环境Docker启动时指定profileruoyi-admin: environment: SPRING_PROFILES_ACTIVE: prod使用configmap管理配置Kubernetes方案kubectl create configmap ruoyi-config \ --from-fileapplication-prod.yml
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻