别再手动装环境了!用Docker Compose一键部署企业内训系统PlayEdu(附完整配置与MinIO避坑指南)
当企业需要搭建内部培训平台时,传统部署方式往往意味着数小时的繁琐配置:安装Java运行环境、配置MySQL数据库、部署Redis缓存、搭建Nginx反向代理...每个环节都可能成为"踩坑现场"。而今天,我们将用Docker Compose实现PlayEdu的全栈容器化部署,从零到生产环境只需15分钟。
1. 为什么选择容器化部署PlayEdu?
传统部署方式需要分别安装:
- Java 11+运行环境
- MySQL 5.7+数据库
- Redis缓存服务
- Nginx Web服务器
- MinIO对象存储
这不仅耗时(平均需要2-4小时),还存在版本兼容性问题。我们曾遇到MySQL 8.0默认认证方式导致PlayEdu连接失败的案例,最终不得不重装MySQL 5.7。
容器化部署则带来三大优势:
- 环境隔离:每个服务运行在独立容器中,避免"污染"主机环境
- 版本固化:镜像版本锁定,确保每次部署环境一致
- 快速回滚:出现问题时,只需回退到上一版本的compose文件
# 传统部署 vs 容器化部署耗时对比 手动部署: - 基础环境配置:40分钟 - 依赖服务安装:60分钟 - 应用部署调试:30分钟 总计:≥130分钟 Docker Compose部署: - 安装Docker:5分钟 - 编写compose文件:5分钟 - 启动服务:5分钟 总计:≤15分钟2. 部署前的环境准备
2.1 服务器基础配置
建议使用以下规格的云服务器:
- CPU:2核以上
- 内存:4GB以上(PlayEdu+MySQL+Redis+MinIO会占用约3GB内存)
- 磁盘:50GB以上(视频类培训内容需要更多存储空间)
# 在CentOS 7上安装Docker Engine sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl enable --now docker2.2 Docker Compose安装
推荐使用v2.x版本,相比v1.x有更好的性能表现:
# 安装Docker Compose v2 DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose注意:如果服务器在中国大陆地区,建议使用国内镜像源加速下载:
curl -SL https://mirrors.aliyun.com/docker-toolbox/linux/compose/v2.20.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
3. 编写生产级docker-compose.yml
以下是经过生产验证的配置方案,特别优化了资源限制和持久化存储:
version: "3.8" services: playedu: image: registry.cn-hangzhou.aliyuncs.com/playedu/light:1.5.2 container_name: playedu-web restart: unless-stopped ports: - "9800:9800" # PC学员端 - "9801:9801" # H5学员端 - "9900:9900" # 管理后台 volumes: - ./nginx/logs:/var/log/nginx environment: - DB_HOST=mysql - DB_PORT=3306 - DB_NAME=playedu - DB_USER=root - DB_PASS=${DB_PASSWORD} - REDIS_HOST=redis - REDIS_PASS=${REDIS_PASSWORD} - REDIS_PORT=6379 - REDIS_DB=2 - SA_TOKEN_IS_CONCURRENT=true - SA_TOKEN_JWT_SECRET_KEY=${JWT_SECRET} depends_on: - mysql - redis - minio deploy: resources: limits: cpus: '1' memory: 1G redis: image: redis:6-alpine container_name: playedu-redis restart: unless-stopped volumes: - ./redis/data:/data environment: - REDIS_PASSWORD=${REDIS_PASSWORD} command: ["redis-server", "--requirepass ${REDIS_PASSWORD}"] healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 10s timeout: 5s retries: 3 mysql: image: mysql:5.7 container_name: playedu-mysql restart: unless-stopped volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d environment: - MYSQL_DATABASE=playedu - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} - TZ=Asia/Shanghai healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${DB_PASSWORD}"] interval: 10s timeout: 5s retries: 3 minio: image: bitnami/minio:2023.8 container_name: playedu-minio restart: unless-stopped ports: - "9000:9000" # API端口 - "9001:9001" # 控制台端口 volumes: - ./minio/data:/bitnami/minio/data environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_DEFAULT_BUCKETS=playedu:public healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3关键优化点说明:
| 配置项 | 传统方案 | 优化方案 | 优势 |
|---|---|---|---|
| 重启策略 | always | unless-stopped | 避免无限重启消耗资源 |
| 资源限制 | 无限制 | 设置CPU/Memory上限 | 防止单个服务耗尽主机资源 |
| 健康检查 | 无 | 配置服务健康监测 | 确保依赖服务就绪 |
| 密码管理 | 明文存储 | 使用环境变量文件 | 提高安全性 |
| 时区配置 | UTC | Asia/Shanghai | 符合国内使用习惯 |
4. MinIO配置深度解析与避坑指南
MinIO是PlayEdu存储学员上传文件的核心组件,也是部署中最容易出问题的环节。以下是经过20+次部署验证的配置经验:
4.1 权限与存储配置
# 创建minio数据目录并设置权限 mkdir -p ./minio/data chmod -R 777 ./minio/data # MinIO容器内部使用非root用户运行4.2 环境变量文件(.env)
创建.env文件管理敏感信息(该文件应加入.gitignore):
# 数据库配置 DB_PASSWORD=PlayEdu@1234 # Redis配置 REDIS_PASSWORD=Redis@1234 # JWT密钥 JWT_SECRET=YourSecretKeyHere # MinIO配置 MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=MinIO@12344.3 常见问题排查
问题1:上传文件时报"系统错误"
- 检查MinIO控制台(http://IP:9001)确认playedu桶是否存在
- 验证PlayEdu后台的MinIO配置是否正确:
| 配置项 | 正确值示例 |
|---|---|
| AccessKey | admin |
| SecretKey | MinIO@1234 |
| Bucket | playedu |
| Endpoint | http://minio:9000 |
| Domain | http://你的服务器IP:9000 |
问题2:文件上传成功但无法访问
- 确认桶策略设置为public:
# 进入MinIO容器执行 mc alias set local http://minio:9000 admin MinIO@1234 mc policy set public local/playedu问题3:存储空间不足
- 定期清理过期文件:
# 查找7天前的文件 find ./minio/data -type f -mtime +7 -exec rm -f {} \;5. 系统初始化与运维实践
5.1 首次启动流程
# 创建项目目录结构 mkdir -p playedu/{mysql/{data,conf},redis/data,minio/data,nginx/logs} # 启动服务 docker compose up -d # 观察日志(按Ctrl+C退出) docker compose logs -f5.2 日常维护命令
# 查看服务状态 docker compose ps # 备份数据库 docker exec playedu-mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" playedu' > playedu-backup-$(date +%Y%m%d).sql # 更新服务版本 docker compose pull docker compose up -d --force-recreate5.3 性能监控建议
在docker-compose.yml中添加Prometheus监控:
services: prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: - "3000:3000"配套的prometheus.yml配置示例:
global: scrape_interval: 15s scrape_configs: - job_name: 'docker' static_configs: - targets: ['playedu:9800', 'mysql:3306', 'redis:6379', 'minio:9000']6. 高级配置技巧
6.1 使用Nginx反向代理
建议在生产环境添加Nginx作为前端代理,统一管理SSL证书和访问控制:
server { listen 443 ssl; server_name training.yourcompany.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location /admin { proxy_pass http://playedu:9900; proxy_set_header Host $host; } location / { proxy_pass http://playedu:9800; proxy_set_header Host $host; } }6.2 数据迁移方案
当需要迁移服务器时,按以下步骤操作:
- 在原服务器停止服务:
docker compose stop- 打包数据目录:
tar czvf playedu-data.tar.gz mysql/data redis/data minio/data- 在新服务器恢复:
tar xzvf playedu-data.tar.gz docker compose up -d6.3 自动备份配置
创建每日自动备份脚本/etc/cron.daily/playedu-backup:
#!/bin/bash BACKUP_DIR=/var/backups/playedu mkdir -p $BACKUP_DIR # 备份MySQL docker exec playedu-mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" playedu' > $BACKUP_DIR/playedu-$(date +%Y%m%d).sql # 备份上传文件 tar czf $BACKUP_DIR/minio-$(date +%Y%m%d).tar.gz -C ./minio/data . # 保留最近7天备份 find $BACKUP_DIR -type f -mtime +7 -delete