从零到一:在openEuler服务器上为RuoYi-Vue项目构建专属Docker镜像(Nginx+Java8+MySQL+Redis)

张开发
2026/4/3 23:41:11 15 分钟阅读
从零到一:在openEuler服务器上为RuoYi-Vue项目构建专属Docker镜像(Nginx+Java8+MySQL+Redis)
从零到一在openEuler服务器上为RuoYi-Vue项目构建专属Docker镜像NginxJava8MySQLRedis当企业级应用需要快速迭代和弹性扩展时容器化部署已成为现代开发的标准实践。本文将带您深入探索如何为典型的前后端分离项目RuoYi-Vue打造一套完整的Docker镜像解决方案从基础镜像选择到多阶段构建优化每个环节都蕴含着值得深思的技术细节。1. 环境准备与架构设计在开始构建之前我们需要明确整个项目的技术栈和容器化架构。RuoYi-Vue作为一个基于Spring Boot和Vue.js的企业级快速开发平台其容器化部署涉及四个核心组件前端服务基于Vue.js构建需要Nginx作为Web服务器后端服务Java 8环境运行的Spring Boot应用数据存储MySQL关系型数据库缓存服务Redis内存数据库在openEuler 22.03 LTS系统上我们首先需要确保Docker环境就绪# 安装Docker及相关工具 sudo dnf install -y docker docker-compose # 启动并设置开机自启 sudo systemctl enable --now docker提示openEuler系统默认的软件源可能下载速度较慢建议配置华为云或阿里云的镜像加速器以提升拉取基础镜像的速度。项目目录结构规划是成功构建的关键前提。我们采用以下组织方式/opt/ruoyi-vue/ ├── backend/ # 后端服务 │ ├── Dockerfile │ └── ruoyi-admin.jar ├── frontend/ # 前端服务 │ ├── dist/ │ ├── conf/ │ │ └── nginx.conf │ └── Dockerfile ├── mysql/ # 数据库服务 │ ├── db/ │ │ └── *.sql │ └── Dockerfile └── redis/ # 缓存服务 ├── conf/ │ └── redis.conf └── Dockerfile2. 前端镜像构建的艺术前端镜像构建看似简单实则暗藏玄机。一个优秀的Nginx镜像应该考虑以下因素配置文件的热更新能力静态资源的高效服务合理的缓存策略安全头部配置以下是经过优化的Dockerfile示例# 使用官方Nginx Alpine镜像减小体积 FROM nginx:1.23-alpine # 设置维护者信息 LABEL maintaineryour-emailexample.com # 创建必要的目录结构 RUN mkdir -p /usr/share/nginx/html/ruoyi \ mkdir -p /etc/nginx/templates # 复制定制化配置 COPY conf/nginx.conf /etc/nginx/nginx.conf COPY conf/default.conf.template /etc/nginx/templates/ # 复制构建好的前端资源 COPY dist/ /usr/share/nginx/html/ruoyi/ # 暴露端口 EXPOSE 80 # 健康检查 HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost/ || exit 1关键优化点包括使用Alpine基础镜像仅约5MB替代标准版引入配置模板支持环境变量注入添加健康检查确保服务可用性合理的目录结构设计nginx.conf配置需要特别注意反向代理的设置server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/ruoyi; try_files $uri $uri/ /index.html; index index.html; # 静态资源缓存策略 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; add_header Cache-Control public, no-transform; } } location /prod-api/ { proxy_pass http://back-end: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; # 超时设置 proxy_connect_timeout 75s; proxy_read_timeout 300s; } }3. 后端Java服务的容器化进阶Java应用的容器化需要特别关注JVM调优和资源限制。以下是一个生产级可用的Dockerfile示例# 多阶段构建构建阶段 FROM maven:3.8.6-eclipse-temurin-8 as builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src/ src/ RUN mvn package -DskipTests # 运行阶段 FROM eclipse-temurin:8-jre-jammy WORKDIR /app # 从构建阶段复制制品 COPY --frombuilder /build/target/ruoyi-admin.jar . # JVM调优参数 ENV JAVA_OPTS-XX:UseContainerSupport \ -XX:MaxRAMPercentage75.0 \ -XX:HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath/var/log/java_heapdump.hprof # 时区设置 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 运行用户 RUN useradd -ms /bin/bash ruoyi chown -R ruoyi:ruoyi /app USER ruoyi # 启动命令 ENTRYPOINT [sh, -c, java ${JAVA_OPTS} -jar ruoyi-admin.jar]这个Dockerfile实现了几个重要优化多阶段构建分离构建环境和运行环境减小最终镜像体积JVM调优适配容器环境的内存管理安全实践使用非root用户运行时区配置避免容器内时间问题构建时可以使用以下命令docker build -t ruoyi-backend:1.0.0 \ --build-arg BUILD_NUMBER$(date %s) \ -f backend/Dockerfile .4. 数据库服务的专业化配置MySQL镜像的构建需要特别关注数据持久化和初始化脚本。以下是增强版的DockerfileFROM mysql:8.0 # 设置中文环境 ENV LANGC.UTF-8 # 复制初始化脚本 COPY db/*.sql /docker-entrypoint-initdb.d/ # 复制定制配置 COPY conf/my.cnf /etc/mysql/conf.d/ # 数据卷声明 VOLUME /var/lib/mysql # 健康检查 HEALTHCHECK --interval30s --timeout3s \ CMD mysqladmin ping -uroot -p${MYSQL_ROOT_PASSWORD} || exit 1配套的my.cnf配置应该包含以下关键参数[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default-authentication-pluginmysql_native_password max_connections200 innodb_buffer_pool_size256M初始化SQL脚本需要特别注意字符集设置CREATE DATABASE IF NOT EXISTS ry-vue DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;5. Redis服务的生产级配置Redis作为缓存服务配置不当可能导致性能问题或安全风险。以下是优化后的DockerfileFROM redis:7.0-alpine # 复制定制配置文件 COPY conf/redis.conf /usr/local/etc/redis/redis.conf # 数据卷声明 VOLUME /data # 健康检查 HEALTHCHECK --interval30s --timeout3s \ CMD redis-cli ping | grep PONG || exit 1 # 使用定制配置启动 CMD [redis-server, /usr/local/etc/redis/redis.conf]redis.conf中应该包含以下关键配置# 绑定所有网络接口 bind 0.0.0.0 # 保护模式关闭因为我们在容器内运行 protected-mode no # 密码认证 requirepass your_strong_password # 持久化策略 save 900 1 save 300 10 save 60 10000 # 内存管理 maxmemory 256mb maxmemory-policy allkeys-lru # 慢查询日志 slowlog-log-slower-than 10000 slowlog-max-len 1286. 容器编排与网络优化使用Docker Compose编排时网络配置对服务发现至关重要。以下是优化后的docker-compose.ymlversion: 3.8 services: ruoyi-mysql: image: ruoyi-mysql:1.0.0 container_name: ruoyi-mysql ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql - mysql_conf:/etc/mysql/conf.d environment: MYSQL_ROOT_PASSWORD: secure_password MYSQL_DATABASE: ry-vue healthcheck: test: [CMD, mysqladmin, ping, -uroot, -psecure_password] interval: 10s timeout: 5s retries: 3 networks: - ruoyi-net ruoyi-redis: image: ruoyi-redis:1.0.0 container_name: ruoyi-redis ports: - 6379:6379 volumes: - redis_data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 10s timeout: 5s retries: 3 networks: - ruoyi-net ruoyi-backend: image: ruoyi-backend:1.0.0 container_name: ruoyi-backend depends_on: ruoyi-mysql: condition: service_healthy ruoyi-redis: condition: service_healthy ports: - 8080:8080 environment: SPRING_PROFILES_ACTIVE: prod networks: - ruoyi-net ruoyi-frontend: image: ruoyi-frontend:1.0.0 container_name: ruoyi-frontend depends_on: ruoyi-backend: condition: service_started ports: - 80:80 networks: - ruoyi-net volumes: mysql_data: mysql_conf: redis_data: networks: ruoyi-net: driver: bridge ipam: config: - subnet: 172.20.0.0/16关键优化点使用健康检查确保服务依赖顺序自定义网络和子网规划数据卷持久化关键数据明确的版本控制7. 构建优化与持续集成在实际生产环境中我们需要考虑构建效率和自动化流程。以下是几个实用技巧并行构建加速# 并行构建所有镜像 docker-compose build --parallel构建缓存利用# 在Dockerfile中合理安排指令顺序 COPY package.json . RUN npm install COPY . .镜像扫描与安全# 使用trivy扫描镜像漏洞 trivy image ruoyi-backend:1.0.0多架构支持# 在Dockerfile中声明支持平台 FROM --platform$BUILDPLATFORM maven:3.8.6-eclipse-temurin-8 as builderCI/CD集成示例# GitHub Actions示例 name: Build and Deploy on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Build images run: docker-compose build - name: Scan images uses: aquasecurity/trivy-actionmaster with: image-ref: ruoyi-backend:1.0.0 format: table exit-code: 1 severity: CRITICAL,HIGH

更多文章