Docker 运行 Redis
镜像、持久化 AOF/RDB 概念。
Docker 跑 Redis:持久化与生产形态
这一课你将能做到
- 用带数据卷、密码、AOF 的 docker run 命令启动一个「重启不丢数据」的 Redis,并解释每个参数
- 亲手做一次「删容器数据全丢」实验,理解 RDB 快照和 AOF 日志的分工与取舍
- 写出生产形态的 docker-compose 片段,说清容器里 host 为什么写 redis 而不是 127.0.0.1
为什么要学
第 1 课你用一行 docker run 起了 Redis——那是个「一次性玩具」:容器一删,所有 key 蒸发。而本站生产环境里 Redis 存着所有人的登录态:没有持久化,Redis 重启 = 全站用户被踢下线。
这一课补上生产视角的三块拼图:数据怎么不丢(持久化)、进程怎么常驻(restart 策略 + compose)、服务怎么被发现(容器网络里的 host)。学完你就能照着本站生产配置搭出一个像样的 Redis 实例。
先建立图像
持久化的两条路:
RDB(快照):每隔一段时间,把整个内存「拍照」存成 dump.rdb
✔ 文件小、恢复快 ✘ 两次快照之间的数据会丢
AOF(日志):每条写命令追加记录到 appendonly.aof,重启时重放
✔ 丢得少(每秒刷盘) ✘ 文件更大、恢复更慢
生产常见组合:AOF 开(everysec)+ RDB 兜底
本站会话场景:会话丢 = 用户重登 → AOF everysec 的 1 秒丢失窗口可接受
跟着做
步骤 1:复现「数据蒸发」
先确认 restart 不会丢:
docker exec -it redis-dev redis-cli
SET precious "data"
exit
docker restart redis-dev
docker exec redis-dev redis-cli GET precious # "data" 还在(重启前有 RDB 落盘)
再验证「删容器 = 一切归零」:
docker exec redis-dev redis-cli SET precious2 "gone-soon"
docker rm -f redis-dev
docker run -d --name redis-dev -p 6379:6379 redis:7-alpine
docker exec redis-dev redis-cli GET precious2
# (nil) —— 没有数据卷,容器即数据,删了就没了
步骤 2:带卷 + 密码 + AOF 重启
docker rm -f redis-dev
docker run -d --name redis-dev \
-p 6379:6379 \
-v redis-data:/data \
--restart unless-stopped \
redis:7-alpine \
redis-server --requirepass "devpass123" --appendonly yes
参数拆解:-v redis-data:/data 命名卷持久化数据目录;--restart unless-stopped 宿主机重启后容器自动拉起;--requirepass 密码认证(生产必开);--appendonly yes 开 AOF。
从这一步起,本课容器带密码,后面所有 redis-cli 命令都要带 -a devpass123。
步骤 3:验证持久化真的生效
docker exec redis-dev redis-cli -a devpass123 SET persist:test "survived"
docker restart redis-dev
docker exec redis-dev redis-cli -a devpass123 GET persist:test
# "survived" ✅
docker exec redis-dev redis-cli -a devpass123 CONFIG GET appendonly
# appendonly → yes
(-a 会把密码留在 shell 历史里,教学环境无妨;生产脚本用 交互输入。)