一、部署步骤总结
1. 环境准备
-
服务器:阿里云 CentOS 系统
-
安装 Docker 及 Docker Compose V2 插件
-
优化宿主机内核参数:
bash
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf && sysctl -p echo never > /sys/kernel/mm/transparent_hugepage/enabled # CentOS 永久关闭透明大页(通过 systemd 服务)
2. 项目目录结构
text
/opt/campus_project/campus_crowdfunding/
├── docker-compose.yml
├── .env
├── redis.conf
├── prometheus.yml
├── secrets/
│ └── redis_password.txt
├── backup-redis.sh
└── ... (应用代码)
3. Redis 配置优化(redis.conf)
-
绑定所有接口,密码从 Docker secret 文件读取
-
开启混合持久化:
appendonly yes+aof-use-rdb-preamble yes -
设置 RDB 快照策略
-
内存限制与 LRU 淘汰策略:
maxmemory 512mb+maxmemory-policy allkeys-lru -
慢查询日志、TCP 连接优化
4. Docker Compose 整合
-
添加 Redis 服务,挂载
redis.conf和 secret 文件 -
配置健康检查(后续调整)
-
应用服务
campus_app通过depends_on依赖 MySQL 和 Redis 健康状态 -
环境变量传递:
REDIS_URL=redis://redis:6379/0和REDIS_PASSWORD_FILE
5. 密码安全管理
-
创建
secrets/redis_password.txt,权限 600 -
在
.env中设置REDIS_PASSWORD保持一致 -
应用容器挂载 secret 文件,通过
REDIS_PASSWORD_FILE读取
6. 备份脚本与定时任务
-
编写
backup-redis.sh:触发BGSAVE,打包redis_data目录,保留 7 天 -
配置 crontab 每天凌晨 3 点执行
7. 启动与验证
-
docker compose up -d启动所有服务 -
检查容器状态、Redis 连接测试、应用日志
二、遇到的问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 1. Redis 容器健康检查失败 | 健康检查命令中使用 CMD-SHELL 且密码包含特殊字符 !@#,shell 解析错误导致认证失败 |
改用 CMD 格式的健康检查: test: ["CMD", "redis-cli", "-a", "$$(cat $${REDIS_PASSWORD_FILE})", "ping"] |
2. docker-compose.yml 报 version is obsolete 警告 |
Docker Compose V2 不再需要 version 字段 |
删除文件第一行的 version: '3.8' |
3. 应用连接 Redis 报 AUTH failed: WRONGPASS |
密码文件末尾含有换行符 \n,应用读取文件时密码变为 "MyPass\n" |
使用 printf '%s' '密码' > secrets/redis_password.txt 重新生成无换行符的密码文件 |
4. 宿主机透明大页永久关闭失败(CentOS 无 apt 命令) |
最初给出的 Ubuntu 命令不适用 CentOS | 改用 CentOS 的 systemd 服务方式永久关闭: 创建 /etc/systemd/system/disable-thp.service 并启用 |
5. 使用 echo 带双引号写入密码时触发 bash 历史展开 |
密码中包含 !,bash 将其解释为历史命令扩展 |
改用单引号或 printf: echo -n '密码' > file 或 printf '%s' '密码' > file |
6. 容器内缺少 redis-cli 或 Python redis 模块 |
应用镜像未预装 Redis 客户端工具 | 临时安装 redis-tools 测试,或使用 Python 一行命令测试连接,测试后不影响生产 |
| 7. 担心阿里云安全组需开放 Redis 端口 | 误解为需要外部访问 | 明确解释:应用与 Redis 在同一 Docker 网络内部通信,ports: "127.0.0.1:6379:6379" 仅绑定本地,安全组无需开放任何 Redis 端口 |
三、最终部署架构
text
┌─────────────────────────────────────────────────────────┐
│ 阿里云 CentOS 服务器 │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Docker Compose 项目 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │
│ │ │ MySQL │ │ Redis │ │ campus_app │ │ │
│ │ │ :3306 │ │ :6379 │◀─┤ :8000 │ │ │
│ │ └──────────┘ └──────────┘ └───────────────┘ │ │
│ │ ▲ ▲ ▲ │ │
│ │ └─────────────┴──────────────┘ │ │
│ │ 内部网络(服务名通信) │ │
│ └───────────────────────────────────────────────────┘ │
│ ▲ │
│ │ 宿主机端口映射 │
│ ▼ │
│ 127.0.0.1:6379 (仅本地) │
│ 0.0.0.0:8000 (对外提供 Web 服务) │
└─────────────────────────────────────────────────────────┘
四、后续运维注意事项
-
监控:通过 Grafana (端口 3000) 查看系统及 Redis 指标
-
备份 :每日自动备份 Redis 数据到
/opt/backups/redis -
安全红线:切勿在阿里云安全组放行 6379 端口,Redis 仅限内部访问
-
更新应用 :
docker compose up -d --build campus_app