Featured image of post Redis Docker 实战:6.x/8.x、持久化、bitnami 镜像与生产配置

Redis Docker 实战:6.x/8.x、持久化、bitnami 镜像与生产配置

官方 redis 镜像与 bitnami/redis 的启动、配置文件、密码认证、关闭持久化、混合持久化、主从复制——Redis 6.0 到 8.6 一次说清

Redis 6.0 引入了多线程 I/OACL 权限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.0ACL、多线程 I/O、SSL主流稳定
6.2细粒度命令权限多租户
7.0混合持久化、Redis Functions、sharded pub/sub新功能
7.2改进 listpack、SCAN 性能性能敏感
8.0异步 I/O、模块化新项目首选
8.6进一步优化 RDB 加载大 key 场景

八、扩展阅读

使用 Hugo 构建
主题 StackJimmy 设计