1. Redis容器化部署背景
Redis作为高性能的键值数据库,在缓存、会话存储、消息队列等场景中广泛应用。传统物理机或虚拟机安装方式需要手动处理依赖、配置环境变量、设置开机启动等繁琐步骤。而通过Docker Compose部署Redis,可以实现:
- 一键启动标准化环境(版本统一、配置一致)
- 快速复制到其他机器(开发/测试/生产环境一致)
- 资源隔离(不污染宿主机环境)
- 版本切换便捷(只需修改镜像标签)
我在多个微服务项目中采用这种部署方式,实测从零开始到Redis服务可用只需3分钟。下面分享具体实现方案和踩坑经验。
2. 环境准备与工具选型
2.1 基础环境要求
- 已安装Docker Engine(版本≥19.03)
- 已安装Docker Compose(版本≥1.25)
- 磁盘空间≥100MB(Redis镜像约30MB)
验证环境:
docker --version docker-compose --version2.2 镜像版本选择
官方Redis镜像提供多个变体:
redis:latest- 最新稳定版(生产慎用)redis:6.2-alpine- 基于Alpine的轻量版(推荐开发使用)redis:6.2- 完整Debian基础版(适合生产环境)
建议根据场景选择:
- 开发测试:
redis:6.2-alpine(资源占用少) - 生产环境:
redis:6.2(稳定性更高)
3. Compose文件详解
创建docker-compose.yml文件:
version: '3.8' services: redis: image: redis:6.2-alpine container_name: my_redis restart: unless-stopped ports: - "6379:6379" volumes: - ./data:/data environment: - REDIS_PASSWORD=your_strong_password command: redis-server --requirepass $${REDIS_PASSWORD}关键配置说明:
网络端口映射:
6379:6379将容器Redis端口映射到宿主机- 如需修改端口,保持右边容器端口不变,只改左边宿主机端口
数据持久化:
./data:/data挂载数据目录到宿主机- Redis默认将持久化数据保存在容器内的
/data目录
安全配置:
- 通过
requirepass设置访问密码 - 密码通过环境变量注入,避免硬编码
- 通过
重启策略:
unless-stopped保证服务异常退出时自动重启
4. 服务启动与管理
4.1 启动Redis服务
docker-compose up -d输出示例:
Creating network "redis_default" with the default driver Creating my_redis ... done4.2 验证服务状态
docker-compose ps正常状态应显示:
Name Command State Ports -------------------------------------------------------------------- my_redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp4.3 连接测试
使用Redis CLI测试连接:
docker exec -it my_redis redis-cli -a your_strong_password成功连接后执行:
127.0.0.1:6379> ping PONG5. 生产环境优化配置
5.1 内存限制
在compose文件中添加资源限制:
deploy: resources: limits: memory: 1G cpus: '0.5'5.2 持久化配置
修改command部分启用AOF持久化:
command: > redis-server --requirepass $${REDIS_PASSWORD} --appendonly yes --appendfsync everysec5.3 多配置文件管理
- 创建自定义配置文件
redis.conf:
requirepass $${REDIS_PASSWORD} appendonly yes maxmemory 1gb- 修改compose文件挂载配置:
volumes: - ./data:/data - ./redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf6. 常见问题排查
6.1 端口冲突错误
错误现象:
Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use解决方案:
- 修改宿主机端口:
"6380:6379" - 或停止占用端口的服务:
sudo lsof -i :6379找到PID后kill
6.2 认证失败
错误现象:
(error) NOAUTH Authentication required检查步骤:
- 确认compose文件中的
REDIS_PASSWORD值 - 重启服务:
docker-compose restart - 进入容器检查配置:
docker exec -it my_redis cat /usr/local/etc/redis/redis.conf
6.3 数据目录权限
错误现象:
Can't open the append-only file: Permission denied解决方法:
mkdir -p data && chmod -R 777 data7. 运维管理命令集
7.1 日常维护
- 查看日志:
docker-compose logs -f redis - 停止服务:
docker-compose stop - 删除容器:
docker-compose down(保留数据卷) - 完全清理:
docker-compose down -v(删除数据卷)
7.2 备份方案
- 手动备份数据卷:
docker run --rm --volumes-from my_redis -v $(pwd):/backup alpine \ tar cvf /backup/redis_backup.tar /data- 定时任务(每天2点备份):
0 2 * * * cd /path/to/compose && docker run --rm --volumes-from my_redis -v $(pwd):/backup alpine tar cvf /backup/redis_$(date +\%Y\%m\%d).tar /data8. 性能监控方案
8.1 内置监控命令
docker exec -it my_redis redis-cli -a your_password info重点关注指标:
used_memory:内存使用量connected_clients:客户端连接数instantaneous_ops_per_sec:每秒操作数
8.2 Prometheus监控
- 修改compose文件:
command: > redis-server --requirepass $${REDIS_PASSWORD} --enable-prometheus-exporter yes- 添加监控端口:
ports: - "6379:6379" - "9121:9121" # Redis Exporter端口- 配置Prometheus抓取:
scrape_configs: - job_name: redis static_configs: - targets: ['redis:9121']9. 集群部署方案
9.1 主从复制配置
修改compose文件实现一主一从:
services: redis-master: image: redis:6.2-alpine command: redis-server --requirepass $${REDIS_PASSWORD} redis-replica: image: redis:6.2-alpine command: > redis-server --requirepass $${REDIS_PASSWORD} --replicaof redis-master 6379 --masterauth $${REDIS_PASSWORD}9.2 Redis Cluster方案
需要6个节点(3主3从),建议使用官方cluster模式:
services: redis-node1: image: redis:6.2-alpine command: redis-server --cluster-enabled yes # 其他5个节点配置类似...初始化集群:
docker-compose exec redis-node1 \ redis-cli --cluster create \ redis-node1:6379 redis-node2:6379 \ redis-node3:6379 redis-node4:6379 \ redis-node5:6379 redis-node6:6379 \ --cluster-replicas 110. 安全加固建议
- 禁用危险命令:
command: > redis-server --requirepass $${REDIS_PASSWORD} --rename-command FLUSHDB "" --rename-command FLUSHALL "" --rename-command CONFIG ""- 网络隔离:
networks: redis-internal: internal: true- 定期轮换密码:
docker-compose exec redis redis-cli -a old_password CONFIG SET requirepass new_password