1. 项目概述
Redis作为当下最流行的内存数据库之一,在缓存、会话存储、消息队列等场景中发挥着重要作用。而Docker Compose作为容器编排工具,能够让我们用声明式的方式定义和运行多容器应用。将二者结合使用,可以快速搭建起一套可移植、易管理的Redis服务环境。
在实际工作中,我发现很多开发者虽然知道Docker和Redis的基本用法,但在用Docker Compose部署Redis时还是会遇到各种问题。比如端口映射配置不当导致连接失败、数据卷挂载位置错误造成数据丢失、内存参数设置不合理影响性能等。本文将基于我多年容器化部署的经验,详细解析如何用Docker Compose正确安装和配置Redis。
2. 环境准备
2.1 Docker与Docker Compose安装
在开始之前,我们需要确保系统已经安装了Docker和Docker Compose。这里以Ubuntu 22.04为例:
bash复制# 安装Docker
sudo apt update
sudo apt install docker.io
# 安装Docker Compose
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
注意:生产环境建议使用特定版本而非最新版,以避免兼容性问题。我通常会在项目文档中固定使用的版本号。
2.2 目录结构规划
良好的目录结构能让后续维护更轻松。我推荐采用以下结构:
code复制redis-docker/
├── docker-compose.yml
├── data/
├── config/
│ └── redis.conf
└── logs/
其中:
data/目录用于持久化Redis数据config/存放自定义配置文件logs/存储日志文件
3. Docker Compose文件编写
3.1 基础配置
创建docker-compose.yml文件,写入以下内容:
yaml复制version: '3.8'
services:
redis:
image: redis:7.0-alpine
container_name: my_redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- ./data:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
关键参数说明:
image: 使用官方Redis镜像,alpine版本更轻量restart: 设置容器异常退出时自动重启ports: 将容器6379端口映射到主机volumes: 挂载数据卷和配置文件
3.2 高级配置示例
对于生产环境,我们需要更完善的配置:
yaml复制services:
redis:
image: redis:7.0-alpine
container_name: production_redis
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
- ./logs:/var/log/redis
environment:
- TZ=Asia/Shanghai
- REDIS_PASSWORD=your_strong_password
sysctls:
- net.core.somaxconn=1024
ulimits:
nofile:
soft: 65535
hard: 65535
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
volumes:
redis_data:
新增的重要配置:
environment: 设置时区和密码sysctls/ulimits: 调整系统参数healthcheck: 添加健康检查- 命名卷
redis_data更利于数据管理
4. Redis配置文件定制
4.1 常用配置项
在config/redis.conf中添加以下配置:
code复制bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
requirepass your_strong_password
maxclients 10000
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
4.2 配置优化建议
根据我的经验,以下几个参数需要特别注意:
-
内存管理:
maxmemory: 根据主机内存设置,通常不超过物理内存的70%maxmemory-policy: 生产环境推荐allkeys-lru
-
持久化:
appendonly: 建议开启AOF持久化appendfsync: 平衡性能和数据安全,通常选everysec
-
性能调优:
tcp-backlog: 高并发场景可增大maxclients: 根据预期连接数调整
5. 服务启动与管理
5.1 启动服务
bash复制docker-compose up -d
-d参数表示后台运行。首次启动时会自动拉取Redis镜像。
5.2 常用操作命令
bash复制# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs -f redis
# 进入Redis容器
docker-compose exec redis redis-cli
# 停止服务
docker-compose down
# 带数据卷删除
docker-compose down -v
5.3 数据备份与恢复
备份:
bash复制docker-compose exec redis redis-cli SAVE
cp ./data/dump.rdb /path/to/backup/
恢复:
- 停止Redis服务
- 用备份的
dump.rdb替换./data/dump.rdb - 重新启动服务
6. 常见问题排查
6.1 连接问题
症状:无法连接到Redis服务
排查步骤:
- 检查容器是否运行:
docker-compose ps - 检查端口映射:
docker-compose port redis 6379 - 查看防火墙设置
- 检查Redis配置中的
bind和protected-mode
6.2 性能问题
症状:响应缓慢,超时增多
解决方案:
- 检查内存使用:
INFO memory - 查看慢查询:
SLOWLOG GET - 调整
maxmemory和maxmemory-policy - 考虑使用Redis集群分担负载
6.3 数据持久化问题
症状:重启后数据丢失
排查步骤:
- 确认AOF或RDB已启用
- 检查挂载卷权限
- 查看持久化配置参数
- 检查磁盘空间是否充足
7. 生产环境建议
根据我在多个项目中的实践经验,生产环境部署Redis还需注意:
-
高可用方案:
- 使用Redis Sentinel实现自动故障转移
- 或者采用Redis Cluster分片集群
-
监控告警:
- 使用Prometheus+Granfa监控Redis指标
- 设置内存使用、连接数等关键指标的告警
-
安全加固:
- 使用强密码并定期更换
- 限制可访问的IP范围
- 禁用危险命令如
FLUSHALL
-
性能优化:
- 根据业务特点调整数据结构配置
- 合理设置过期时间避免内存膨胀
- 使用Pipeline减少网络往返
8. 扩展配置示例
8.1 主从复制配置
yaml复制version: '3.8'
services:
redis-master:
image: redis:7.0-alpine
container_name: redis-master
ports:
- "6379:6379"
volumes:
- ./master-data:/data
command: redis-server --requirepass your_strong_password --appendonly yes
redis-replica:
image: redis:7.0-alpine
container_name: redis-replica
ports:
- "6380:6379"
volumes:
- ./replica-data:/data
command: >
redis-server --replicaof redis-master 6379
--masterauth your_strong_password
--appendonly yes
depends_on:
- redis-master
8.2 哨兵模式配置
yaml复制version: '3.8'
services:
redis-master:
image: redis:7.0-alpine
container_name: redis-master
ports:
- "6379:6379"
command: redis-server --requirepass your_strong_password --appendonly yes
redis-replica:
image: redis:7.0-alpine
container_name: redis-replica
ports:
- "6380:6379"
command: >
redis-server --replicaof redis-master 6379
--masterauth your_strong_password
--appendonly yes
depends_on:
- redis-master
sentinel1:
image: redis:7.0-alpine
container_name: redis-sentinel1
ports:
- "26379:26379"
command: >
redis-server /etc/redis/sentinel.conf --sentinel
volumes:
- ./sentinel1.conf:/etc/redis/sentinel.conf
depends_on:
- redis-master
- redis-replica
sentinel2:
image: redis:7.0-alpine
container_name: redis-sentinel2
ports:
- "26380:26379"
command: >
redis-server /etc/redis/sentinel.conf --sentinel
volumes:
- ./sentinel2.conf:/etc/redis/sentinel.conf
depends_on:
- redis-master
- redis-replica
sentinel3:
image: redis:7.0-alpine
container_name: redis-sentinel3
ports:
- "26381:26379"
command: >
redis-server /etc/redis/sentinel.conf --sentinel
volumes:
- ./sentinel3.conf:/etc/redis/sentinel.conf
depends_on:
- redis-master
- redis-replica
对应的哨兵配置文件示例:
code复制port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster your_strong_password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
9. 最佳实践总结
经过多个项目的实践验证,以下是我总结的Docker Compose部署Redis的最佳实践:
-
镜像选择:
- 生产环境使用特定版本标签,避免使用latest
- Alpine版本更轻量,但需要测试兼容性
-
数据持久化:
- 同时启用RDB和AOF
- 定期测试备份恢复流程
-
资源限制:
- 为容器设置内存限制:
deploy.resources.limits.memory - 监控SWAP使用情况
- 为容器设置内存限制:
-
网络配置:
- 生产环境建议使用自定义网络
- 考虑启用TLS加密传输
-
日志管理:
- 将日志输出到文件和外挂卷
- 配置日志轮转避免磁盘占满
-
配置管理:
- 将配置与镜像解耦
- 使用环境变量管理敏感信息
在实际部署中,我发现很多问题都源于对基础配置的忽视。比如有一次线上事故就是因为没有设置maxmemory导致Redis内存溢出,最终影响了整个服务的稳定性。从那以后,我在每个Redis部署中都会特别注意内存相关的配置。
