Docker全栈部署PlayEdu培训系统实战指南
企业培训系统容器化部署新趋势
在数字化转型浪潮中,企业内部培训系统的云端部署需求呈现爆发式增长。PlayEdu作为一款基于Java+MySQL开发的开源培训系统,凭借其前后端分离架构和丰富的功能模块,正成为企业构建私有化学习平台的热门选择。传统部署方式需要手动配置Java运行环境、MySQL数据库、Redis缓存和文件存储服务,过程繁琐且容易出错。而Docker容器化技术通过标准化应用打包和依赖管理,使整个部署过程变得高效可靠。
本指南将采用Docker Compose工具链,实现PlayEdu系统及其所有依赖服务的一键式部署。与单容器部署方案相比,Compose方案具有三大优势:环境隔离性确保各服务互不干扰;配置可移植性使部署文件可在不同环境快速复用;编排自动化简化了多服务启动流程。我们特别针对生产环境需求,优化了MySQL持久化存储、Redis性能配置以及MinIO对象存储方案,并提供了详细的安全加固建议。
1. 基础环境准备与优化配置
1.1 Docker引擎与Compose安装
推荐使用官方安装脚本配合阿里云镜像源加速下载过程。对于CentOS/RHEL系统,执行以下命令完成Docker CE最新版安装:
# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 设置yum仓库 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装Docker引擎 sudo yum install -y docker-ce docker-ce-cli containerd.io # 配置镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-aliyun-mirror.mirror.aliyuncs.com"] } EOF # 启动服务 sudo systemctl enable docker sudo systemctl start docker对于Docker Compose的安装,建议下载v2.x版本以获得更好的兼容性:
# 下载二进制文件 sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 设置执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker-compose --version1.2 系统资源预检查
部署前需确保主机满足以下资源配置要求:
| 资源类型 | 最低配置 | 推荐配置(100并发) |
|---|---|---|
| CPU | 2核 | 4核 |
| 内存 | 4GB | 8GB |
| 磁盘 | 50GB | 100GB SSD |
| 网络 | 100Mbps | 1Gbps |
关键目录权限设置:
sudo mkdir -p /data/playedu/{mysql,redis,minio} sudo chmod -R 775 /data/playedu sudo setenforce 0 # 临时关闭SELinux2. 多服务容器编排部署
2.1 Docker网络与存储规划
创建专属桥接网络确保服务间安全通信:
docker network create --driver bridge --subnet=172.28.0.0/16 playedu-net持久化存储卷配置建议:
- MySQL数据目录:/data/playedu/mysql
- Redis数据目录:/data/playedu/redis
- MinIO数据目录:/data/playedu/minio/data
- MinIO配置目录:/data/playedu/minio/conf
2.2 Compose文件深度解析
创建docker-compose.yml文件,包含以下核心服务:
version: '3.8' services: mysql: image: mysql:8.0 container_name: playedu-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: playedu@123 MYSQL_DATABASE: playedu TZ: Asia/Shanghai volumes: - /data/playedu/mysql:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf networks: - playedu-net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 3 redis: image: redis:7.0 container_name: playedu-redis restart: unless-stopped command: redis-server --requirepass playedu@456 volumes: - /data/playedu/redis:/data networks: - playedu-net healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 minio: image: minio/minio:RELEASE.2023-09-04T19-57-37Z container_name: playedu-minio restart: unless-stopped environment: MINIO_ROOT_USER: playeduadmin MINIO_ROOT_PASSWORD: playedu@789 volumes: - /data/playedu/minio/data:/data - /data/playedu/minio/conf:/root/.minio command: server --console-address ":50000" /data ports: - "9000:9000" - "50000:50000" networks: - playedu-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 playedu: image: registry.cn-hangzhou.aliyuncs.com/playedu/light:1.8 container_name: playedu-web restart: unless-stopped depends_on: mysql: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy environment: DB_HOST: mysql DB_PORT: 3306 DB_NAME: playedu DB_USER: root DB_PASS: playedu@123 REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASS: playedu@456 SA_TOKEN_JWT_SECRET_KEY: playedu@2023 volumes: - ./nginx/logs:/var/log/nginx ports: - "9700:80" # API服务 - "9800:9800" # PC学员端 - "9801:9801" # H5学员端 - "9900:9900" # 管理后台 networks: - playedu-net networks: playedu-net: external: true关键配置说明:
- MySQL:启用二进制日志和时间戳配置,建议在my.cnf中添加:
[mysqld] log-bin=mysql-bin binlog_format=ROW default-time-zone='+8:00' - Redis:配置了密码认证并关闭了危险命令:
command: redis-server --requirepass playedu@456 --rename-command FLUSHDB "" --rename-command FLUSHALL "" - MinIO:控制台端口与API端口分离,便于安全管理
2.3 服务启动与验证
分阶段启动服务确保依赖顺序:
# 启动基础服务 docker-compose up -d mysql redis minio # 等待数据库初始化完成(约2分钟) sleep 120 # 启动PlayEdu应用 docker-compose up -d playedu服务健康检查命令:
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" docker logs playedu-web -f # 实时查看日志3. MinIO存储系统专项配置
3.1 控制台初始化
访问MinIO控制台完成初始配置:
- 通过
http://服务器IP:50000访问控制台 - 使用compose文件中配置的账号密码登录(默认playeduadmin/playedu@789)
- 创建名为
playedu的存储桶(Bucket) - 设置Bucket访问策略为public
3.2 PlayEdu后台对接配置
登录PlayEdu管理后台(http://服务器IP:9900),配置MinIO连接:
| 配置项 | 示例值 |
|---|---|
| AccessKey | playeduadmin |
| SecretKey | playedu@789 |
| Bucket | playedu |
| Endpoint | http://playedu-minio:9000 |
| Domain | http://服务器IP:9000 |
注意:Endpoint使用容器名而非IP,确保容器内可解析
3.3 存储优化建议
- 数据持久化:定期备份MinIO数据目录
tar -czvf minio-backup-$(date +%Y%m%d).tar.gz /data/playedu/minio/data - 性能调优:对于高并发场景,建议:
- 增加MinIO节点实现分布式存储
- 配置NGINX反向代理实现负载均衡
- 安全加固:
- 定期轮换AccessKey/SecretKey
- 启用MinIO TLS加密传输
4. 系统运维与故障排查
4.1 日常维护命令
# 查看容器资源占用 docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" # 执行MySQL备份 docker exec playedu-mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" playedu' > playedu-backup.sql # 清理Redis缓存 docker exec -it playedu-redis redis-cli -a playedu@456 FLUSHDB4.2 常见问题解决方案
问题1:PlayEdu启动后无法连接MySQL
- 检查MySQL容器日志:
docker logs playedu-mysql - 验证网络连通性:
docker exec playedu-web ping mysql
问题2:文件上传失败
- 检查MinIO Bucket权限:
docker exec playedu-minio mc ls play/ - 验证存储目录权限:
ls -ld /data/playedu/minio/data
问题3:系统运行缓慢
- 检查Redis内存使用:
docker exec playedu-redis redis-cli -a playedu@456 INFO memory - 分析MySQL慢查询:
docker exec playedu-mysql mysql -uroot -pplayedu@123 -e "SHOW PROCESSLIST"
4.3 监控方案建议
- 基础监控:
# 安装cAdvisor容器监控 docker run -d --name=cadvisor --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 google/cadvisor:latest - 日志收集:配置ELK栈收集容器日志
- 告警设置:对以下指标设置阈值告警:
- MySQL连接数 > 80%
- Redis内存使用 > 70%
- 容器CPU持续 > 90%
5. 高级部署方案扩展
5.1 生产环境集群部署
对于高可用需求,建议采用Swarm或Kubernetes集群部署:
# docker-stack.yml 示例 version: '3.8' services: mysql: image: mysql:8.0 deploy: replicas: 1 resources: limits: cpus: '2' memory: 4G configs: - source: mysql_conf target: /etc/mysql/conf.d/my.cnf secrets: - mysql_root_password playedu: image: registry.cn-hangzhou.aliyuncs.com/playedu/light:1.8 deploy: replicas: 3 update_config: parallelism: 1 delay: 30s depends_on: - mysql - redis configs: mysql_conf: file: ./mysql/my.cnf secrets: mysql_root_password: file: ./mysql/password.txt5.2 CI/CD集成示例
GitLab CI流水线配置片段:
deploy: stage: deploy script: - docker-compose -f docker-compose.prod.yml down - docker-compose -f docker-compose.prod.yml pull - docker-compose -f docker-compose.prod.yml up -d only: - master tags: - docker5.3 版本升级策略
- 小版本升级(1.8.0 → 1.8.1):
docker-compose pull playedu docker-compose up -d --force-recreate playedu - 大版本升级(1.8 → 2.0):
- 备份数据库和存储文件
- 测试新版本兼容性
- 分阶段灰度发布
实际部署中遇到的最典型问题是MinIO权限配置不当导致的文件上传失败。通过为/data目录设置777权限并确保Bucket策略正确,可以解决90%的存储相关问题。建议在部署完成后立即进行全功能测试,特别是文件上传和权限管理模块。