Redis 6.0 引入了多线程 I/O、ACL 权限、SSL 加密;8.x(2024)改进了 RDB 加载速度、模块化。生产环境的 Redis 在 Docker 里跑有几个常见问题:持久化怎么配、密码怎么改、主从怎么搭、要不要关 RDB。这篇文章把 Redis 6.0 到 8.6 的官方镜像和 bitnami 镜像的部署、配置、调优一次性收齐。
阅读对象:日常用 Redis 做缓存/分布式锁/排行榜/限流,要在容器里跑单实例或主从,关注内存、持久化、ACL 的同学。
覆盖范围:官方 redis:6.0/8.6 镜像启动;bitnami/redis 镜像(推荐生产用);redis.conf 关键配置;RDB / AOF / 混合持久化关闭;主从复制(docker run + 配置文件);客户端连接与排错。
一、Redis 在 Docker 里的几个关键决策
| 决策 | 选项 | 适用 |
|---|
| 镜像 | 官方 redis / bitnami/redis | 官方更轻,bitnami 多 healthcheck + 非 root |
| 持久化 | RDB(默认)/ AOF / 混合 / 全关 | 缓存场景:关;持久场景:开 |
| 网络模式 | host / bridge | 性能优先 host,安全优先 bridge |
| 部署形态 | 单机 / 主从 / Sentinel / Cluster | 单机演示,主从高可用,Cluster 大数据量 |
| 内存淘汰 | noeviction / allkeys-lru 等 | 写多:noeviction;缓存:allkeys-lru |
二、官方 redis 镜像
2.1 拉取与启动
1
2
3
4
5
6
7
8
9
10
| # 拉镜像
docker pull redis:6.0.3-alpine3.11
docker pull redis:8.6.3-alpine3.23
# 启动(host 网络,性能好)
docker run -d --name redis \
--net=host \
--restart=always \
redis:8.6.3-alpine3.23 \
redis-server /usr/local/etc/redis/redis.conf
|
alpine 镜像比 debian 镜像小 100MB+,但 musl libc 的 redis-benchmark 等工具有兼容性问题,生产一般用 debian 镜像。
2.2 创建宿主机目录
1
2
| mkdir /home/docker/redis/{conf,data,logs} -p
cd /home/docker/redis
|
2.3 准备 redis.conf
1
2
3
4
5
6
7
8
9
| # 下载官方模板
wget https://raw.githubusercontent.com/redis/redis/8.6/redis.conf \
-O /home/docker/redis/conf/redis.conf
# 改几个关键参数
sed -i 's/logfile ""/logfile "access.log"/' /home/docker/redis/conf/redis.conf
sed -i 's/# requirepass foobared/requirepass {{REDACTED}}/' /home/docker/redis/conf/redis.conf
sed -i 's/appendonly no/appendonly yes/' /home/docker/redis/conf/redis.conf
sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /home/docker/redis/conf/redis.conf
|
2.4 启动(挂载配置 + 数据)
1
2
3
4
5
6
7
8
9
10
| docker run \
-p 6379:6379 \
-v /home/docker/redis/data:/data \
-v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
--net mynetwork --ip 172.18.0.5 \
--privileged=true \
--name redis \
--restart=always \
-d redis:6.0.3-alpine3.11 \
redis-server /etc/redis/redis.conf
|
2.5 客户端连接
1
2
3
4
5
6
| # 容器内
docker exec -it redis /bin/sh
redis-cli -h 127.0.0.1 -p 6379 -a {{REDACTED}}
# 宿主机直接连
docker run -it --link redis:redis --rm redis redis-cli -h redis -p 6379
|
2.6 docker-compose 模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| version: "3"
services:
redis:
container_name: redis
image: <your-public-ip>:13001/base/redis:6.0.3-alpine3.11
network_mode: "host"
command: redis-server /etc/redis/redis.conf
restart: always
volumes:
- /home/docker/redis/data:/data:rw
- /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf
- /home/docker/redis/logs:/logs
privileged: true
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
|
三、bitnami/redis 镜像(生产推荐)
bitnami/redis 的优势:非 root 进程、Tini init、healthcheck、Redis 风格环境变量(REDIS_PASSWORD 等都大写)、自带 Sentinel 模板。
3.1 启动
1
2
3
4
5
6
7
| docker pull bitnami/redis:6.2.14-debian-12-r21
docker run -d \
--name redis \
-p 6379:6379 \
-e REDIS_PASSWORD={{REDACTED}} \
bitnami/redis:6.2.14-debian-12-r21
|
环境变量 REDIS_PASSWORD:自动生成 requirepass。比直接改 conf 文件方便。
四、持久化策略
4.1 三种持久化机制
| 机制 | 默认 | 特点 | 适用 |
|---|
| RDB(快照) | 开启 | 周期性 dump,体积小,恢复快 | 接受分钟级数据丢失 |
| AOF(追加日志) | 关闭 | 每条写命令追加日志,最多丢 1 秒数据 | 不能丢数据 |
| 混合持久化 | 7.0+ 默认 | RDB + AOF 结合 | 大多数生产场景 |
4.2 关闭持久化(纯缓存场景)
1
2
3
4
5
6
7
8
9
10
11
12
| # redis.conf
# 1. 关闭 RDB 自动快照
save ""
# 2. 关闭 AOF 增量持久化
appendonly no
# 3. 关闭混合持久化(7.0+)
rdb-aof-use-rdb-preamble no
# 4. 主从同步后立刻删除 RDB 临时文件
rdb-del-sync-files yes
|
重启服务后生效。这种配置相当于"纯缓存",重启 = 数据全清,只用于缓存场景。
4.3 推荐生产配置
1
2
3
4
5
6
7
8
9
10
11
| # 1. 开启 AOF(默认关)
appendonly yes
appendfsync everysec # 每秒刷盘,最多丢 1 秒
# 2. RDB 兜底
save 3600 1 # 1 小时至少 1 个 key 变化
save 300 100 # 5 分钟至少 100 个 key 变化
save 60 10000 # 1 分钟至少 10000 个 key 变化
# 3. 7.0+ 混合持久化
rdb-aof-use-rdb-preamble yes
|
五、主从复制
5.1 启动 master
1
2
3
4
5
6
7
| docker run -d --name redis-master \
-p 6379:6379 \
-v /home/docker/redis/data:/data \
-v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
--restart=always \
redis:6.0.3-alpine3.11 \
redis-server /etc/redis/redis.conf
|
5.2 启动 slave
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # 1. 查 master 内部 IP
docker inspect redis-master | grep IPAddress
# "IPAddress": "172.18.0.X"
# 2. 准备 slave 配置文件(追加)
cat << 'EOF' >> /home/docker/redis-slave/conf/redis.conf
replicaof 172.18.0.X 6379
masterauth {{REDACTED}}
replica-read-only yes
EOF
# 3. 启动 slave
docker run -d --name redis-slave \
-p 6380:6379 \
-v /home/docker/redis-slave/data:/data \
-v /home/docker/redis-slave/conf/redis.conf:/etc/redis/redis.conf \
--restart=always \
redis:6.0.3-alpine3.11 \
redis-server /etc/redis/redis.conf
|
从 Redis 5.0 开始,slaveof 改名为 replicaof,但旧名仍然兼容。
5.3 验证复制
1
2
3
4
5
6
| # master 写入
docker exec -it redis-master redis-cli -a {{REDACTED}} set test_key hello
# slave 读取
docker exec -it redis-slave redis-cli -a {{REDACTED}} get test_key
# "hello"
|
六、常见排错
6.1 连接被拒
1
2
3
4
5
6
7
8
| # 1. 看容器是否在跑
docker ps | grep redis
# 2. 看日志
docker logs redis
# 3. 看网络
docker network inspect bridge | grep redis
|
6.2 密码忘了
1
2
3
4
5
6
7
| # 1. 进容器,关掉 requirepass
docker exec -it redis bash
redis-cli
CONFIG SET requirepass ""
# 2. 改 conf 文件持久化
echo "requirepass <new_password>" >> /home/docker/redis/conf/redis.conf
|
6.3 内存满
1
2
3
4
5
| # 看使用情况
redis-cli info memory | grep used_memory_human
# 触发淘汰
CONFIG SET maxmemory-policy allkeys-lru
|
七、Redis 6.x/7.x/8.x 关键差异
| 版本 | 关键特性 | 适合 |
|---|
| 6.0 | ACL、多线程 I/O、SSL | 主流稳定 |
| 6.2 | 细粒度命令权限 | 多租户 |
| 7.0 | 混合持久化、Redis Functions、sharded pub/sub | 新功能 |
| 7.2 | 改进 listpack、SCAN 性能 | 性能敏感 |
| 8.0 | 异步 I/O、模块化 | 新项目首选 |
| 8.6 | 进一步优化 RDB 加载 | 大 key 场景 |
八、扩展阅读