Redis 8 Docker Compose 部署指南
使用 Docker Compose 一键部署 Redis 8(官方镜像 `redis:8`),涵盖数据目录持久化、**配置文件持久化(conf 挂载)**、密码注入、AOF 持久化与健康检查,并给出等价的 `docker run` 运行方式。本文档已在 `/opt/data/ops/redis` 目录实测通过(容器 healthy、重启数据保留、密码认...
Redis 8 Docker Compose 部署指南
目标:使用 Docker Compose 一键部署 Redis 8(官方镜像
redis:8),涵盖数据目录持久化、配置文件持久化(conf 挂载)、密码注入、AOF 持久化与健康检查,并给出等价的docker run运行方式。本文档已在/opt/data/ops/redis目录实测通过(容器 healthy、重启数据保留、密码认证强制)。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- 系统架构:x86_64
- Docker 版本:Docker Engine 27.x(含 Compose v2 插件)
- 镜像版本:
redis:8(对应 Redis 8.10.2,与《Ubuntu 22.04 安装 Redis 8 指南》版本一致) - 容器名称:
redis-8 - 端口映射:宿主机
16379→ 容器6379 - 数据目录:宿主机
/opt/data/ops/redis/data(挂载到容器/data) - 配置目录:宿主机
/opt/data/ops/redis/conf(挂载到容器/usr/local/etc/redis/redis.conf) - 部署文件:
/opt/data/ops/redis/docker-compose.yaml
二、镜像选型说明
| 镜像标签 | 对应版本 | 特点 |
|---|---|---|
redis:8 | Redis 8(当前最新稳定系列) | 官方维护,含全部小版本安全修复 |
redis:7 | Redis 7 系列 | 上一代稳定版 |
redis:latest | 最新稳定版(当前指向 8.x) | 版本会随上游变化,不建议生产锁定 |
💡 说明:官方镜像仓库为
docker.io/library/redis。国内拉取可配置阿里云 / daocloud 镜像加速器,或通过中转节点拉取后docker load导入宿主机(本文档实测即采用此方式,镜像已 load 到宿主机)。
三、前置条件
- 已安装 Docker Engine 与 Docker Compose 插件:
docker --version && docker compose version - 已规划数据目录(建议放在独立磁盘,避免系统盘被数据占满)
- 已准备好强密码(禁止使用默认/弱密码,见"六、常用环境变量表"章节)
四、部署步骤
4.1 创建部署目录
sudo mkdir -p /opt/data/ops/redis
cd /opt/data/ops/redis
4.2 编写 docker-compose.yaml
将以下内容保存为 /opt/data/ops/redis/docker-compose.yaml:
# =============================================================================
# Redis 8 Docker Compose 部署文件
# 镜像版本:redis:8(对应 Redis 8.10.2,与《Ubuntu 22.04 安装 Redis 8 指南》版本一致)
# 使用方式:cd /opt/data/ops/redis && docker compose up -d
# 密码等敏感值通过环境变量注入,请先 export(见文档"六、常用环境变量表"章节)
# =============================================================================
services:
redis:
# 镜像版本:8.x 官方镜像
image: redis:8
# 容器名称,方便 docker ps / docker logs 定位
container_name: redis-8
# 重启策略:容器异常退出时自动重启(除非手动 stop)
restart: unless-stopped
# ---- 常用环境变量配置(值由外部环境变量注入)----
environment:
- TZ=Asia/Shanghai # 容器时区(与宿主机一致)
- REDIS_PASSWORD=${REDIS_PASSWORD:?请在环境变量中设置} # 密码(供健康检查等容器内命令使用)
# ---- 启动命令:使用自定义配置文件 + 密码注入 ----
# 注意:redis.conf 中的 requirepass 无法做变量替换,
# 因此密码通过命令行参数传入(优先级高于配置文件)
command:
- "redis-server"
- "/usr/local/etc/redis/redis.conf"
- "--requirepass"
- "${REDIS_PASSWORD:?请在环境变量中设置}"
# ---- 端口映射:宿主机16379 -> 容器6379 ----
ports:
- "16379:6379"
# ---- 数据持久化(重要)----
# ./data 为宿主机数据目录(对应 conf 中 dir /data),AOF/RDB 文件落在该目录
volumes:
- ./data:/data
# ---- 配置文件持久化(重要)----
# ./conf 为宿主机配置目录,挂载到 /usr/local/etc/redis/redis.conf,
# 编辑 ./conf/redis.conf 后 docker compose restart redis 即可生效
- ./conf/redis.conf:/usr/local/etc/redis/redis.conf
# ---- 健康检查:redis-cli ping 判断数据库就绪 ----
healthcheck:
test: ["CMD-SHELL", "redis-cli -a $${REDIS_PASSWORD} ping | grep PONG"]
interval: 10s # 每 10 秒检查一次
timeout: 5s # 单次检查超时
retries: 10 # 连续 10 次失败视为不健康
start_period: 15s # 启动后 15 秒才开始检查
# 容器日志大小限制,防止磁盘被日志占满
logging:
driver: json-file
options:
max-size: "50m"
max-file: "3"
💡 说明:密码为什么走命令行参数? redis.conf 中的
requirepass无法引用环境变量做替换,因此密码通过command追加--requirepass ${REDIS_PASSWORD:?}注入(命令行参数优先级高于配置文件)。同时REDIS_PASSWORD必须注入容器环境(environment),供健康检查命令redis-cli -a $${REDIS_PASSWORD}使用。
4.3 创建自定义配置文件
将以下内容保存为 /opt/data/ops/redis/conf/redis.conf:
# Redis 自定义配置文件(挂载到 /usr/local/etc/redis/redis.conf)
# 启动命令:redis-server /usr/local/etc/redis/redis.conf
# 修改后重启容器生效:docker compose restart redis
# ---- 网络 ----
# 监听所有网卡(配合端口映射供外部连接,密码保护)
bind 0.0.0.0
port 6379
protected-mode yes
# ---- 持久化(重要)----
# 数据目录(对应数据卷 ./data:/data),AOF/RDB 文件保存在此
dir /data
# 开启 AOF 追加持久化(每次写命令追加,重启数据不丢失)
appendonly yes
appendfilename "appendonly.aof"
# AOF 刷盘策略:everysec 每秒刷盘(性能与安全的折中)
appendfsync everysec
# ---- 内存 ----
# 内存上限(按需调整,0 表示不限制)
# maxmemory 512mb
# 达到上限后的淘汰策略(默认 noeviction 拒绝写入)
# maxmemory-policy allkeys-lru
# ---- 密码 ----
# 说明:requirepass 由 compose 命令行参数注入(--requirepass),
# 此处不写死密码;如需固定密码可取消注释:
# requirepass your-password
# ---- 安全/常规 ----
# 后台运行(容器内必须为 no,由 docker 管理进程)
daemonize no
# 日志级别:debug/verbose/notice/warning
loglevel notice
# 日志文件(容器内建议使用 stdout,即不设置 logfile,由 docker logs 收集)
# logfile /var/log/redis/redis-server.log
# 数据库数量
databases 16
💡 说明:
dir /data与数据卷./data:/data对应,AOF/RDB 文件落在宿主机./data目录实现持久化。daemonize no必须保持(容器内由 docker 管理进程,后台化会导致容器退出)。
4.4 设置环境变量并启动
# 注入密码(供启动命令与健康检查使用)
export REDIS_PASSWORD='your-password'
docker compose up -d
💡 说明:
${REDIS_PASSWORD:?请在环境变量中设置}语法表示:若该环境变量未设置,docker compose up会直接报错退出,防止密码缺失导致 Redis 无认证启动。
4.5 验证部署
# 查看容器状态(healthy 表示健康检查通过)
docker ps --filter name=redis-8
# 使用密码连接测试
docker exec -it redis-8 redis-cli -a "$REDIS_PASSWORD" ping
# 数据读写与持久化验证
docker exec -it redis-8 redis-cli -a "$REDIS_PASSWORD" set hello world
docker exec -it redis-8 redis-cli -a "$REDIS_PASSWORD" get hello
# 验证鉴权生效(无密码访问应被拒绝)
docker exec -it redis-8 redis-cli ping
执行结果(鉴权验证):
(error) NOAUTH Authentication required.
💡 说明:无密码访问返回
NOAUTH错误,确认密码认证已强制生效。健康检查每 10 秒用密码 ping 一次,失败 10 次容器标记为 unhealthy。
五、数据持久化说明
- 数据目录映射:
./data:/data,AOF(appendonly.aof)与 RDB(dump.rdb)文件全部落在宿主机./data目录。 - 配置目录映射:
./conf/redis.conf:/usr/local/etc/redis/redis.conf,自定义配置落在宿主机./conf,修改后docker compose restart redis生效。 - 重启容器(
docker compose restart/docker compose up -d)数据不丢失(AOF 已开启,实测验证)。 - 删除容器不会删除数据:
docker compose down只移除容器,卷目录./data与./conf仍在;只有docker compose down -v才会删除卷数据。 - 备份:对宿主机
./data目录做快照/rsync,或使用redis-cli SAVE/BGSAVE生成 RDB 备份。 - 权限说明:
redis:8镜像内 Redis 以redis用户(uid 999)运行,首次启动时镜像会自动对挂载目录做chown,无需手动处理权限。
六、常用环境变量表
| 环境变量 | 默认值 | 说明 |
|---|---|---|
REDIS_PASSWORD | (必填,无默认) | 访问密码,通过命令行 --requirepass 注入 |
TZ | 镜像默认(UTC) | 容器时区,建议与宿主机一致 |
⚠️ 安全提醒:
REDIS_PASSWORD属于敏感值,务必通过环境变量注入,禁止写入 yaml 明文。生产环境可用 Docker secrets 或密码管理工具注入。
七、配置文件说明(conf/redis.conf)
| 配置项 | 默认值 | 说明 |
|---|---|---|
bind | 0.0.0.0 | 监听所有网卡,配合端口映射供外部连接(密码保护) |
port | 6379 | 容器内监听端口(对外映射 16379) |
dir | /data | 数据目录,与数据卷 ./data:/data 对应 |
appendonly | yes | 开启 AOF 追加持久化,重启数据不丢失 |
appendfsync | everysec | AOF 刷盘策略(always/everysec/no) |
requirepass | 由命令行注入 | 访问密码(conf 中未写死) |
daemonize | no | 容器内必须为 no(由 docker 管理进程) |
八、等价 docker run 运行方式
不使用 Compose 时,可用以下 docker run 达到相同效果:
# 先注入环境变量
export REDIS_PASSWORD='your-password'
docker run -d \
--name redis-8 \
--restart unless-stopped \
-e TZ=Asia/Shanghai \
-e REDIS_PASSWORD="$REDIS_PASSWORD" \
-p 16379:6379 \
-v /opt/data/ops/redis/data:/data \
-v /opt/data/ops/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--health-cmd='redis-cli -a "$REDIS_PASSWORD" ping | grep PONG' \
--health-interval=10s \
--health-timeout=5s \
--health-retries=10 \
--health-start-period=15s \
redis:8 \
redis-server /usr/local/etc/redis/redis.conf \
--requirepass "$REDIS_PASSWORD"
参数对照:
| Compose 写法 | docker run 写法 |
|---|---|
image: redis:8 | 末尾镜像名 redis:8 |
container_name | --name |
restart: unless-stopped | --restart unless-stopped |
environment | -e KEY=value |
ports: "16379:6379" | -p 16379:6379 |
volumes: ./data:/data | -v /opt/data/ops/redis/data:/data |
volumes: ./conf/redis.conf:/usr/local/etc/redis/redis.conf | -v /opt/data/ops/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf |
healthcheck | --health-cmd / --health-interval 等 |
command | 镜像名之后的附加参数 |
💡 说明:
--health-cmd与--requirepass中"$REDIS_PASSWORD"会被 shell 展开为容器内环境变量值,故无需转义$(与 Compose 中需$$转义不同)。
九、常用运维命令
# 查看日志
docker logs -f redis-8
# 重启容器(数据保留)
docker compose restart
# 停止并移除容器(保留数据)
docker compose down
# 彻底移除容器 + 数据目录(谨慎操作!)
docker compose down -v
# 进入 redis-cli 交互
docker exec -it redis-8 redis-cli -a "$REDIS_PASSWORD"
十、常见问题(FAQ)
10.1 容器反复重启(Exited / Restarting 循环)?
查看日志定位:docker logs redis-8。常见原因:① daemonize yes 导致容器退出(必须为 no);② conf 中 dir 与挂载目录不一致;③ conf 语法错误。
10.2 端口映射失败:宿主机 16379 已被占用?
修改 ports 为其他宿主机端口,如 "16380:6379"。注意客户端连接地址随之变化。
10.3 修改密码后连接报 NOAUTH / Authentication failed?
- 密码通过 compose 的
REDIS_PASSWORD环境变量注入,修改后需docker compose up -d(重建容器)或重启生效。 - 若在 conf 中取消注释
requirepass,注意命令行--requirepass优先级更高,两者需保持一致。
10.4 无密码也能连上(鉴权未生效)?
确认已设置 REDIS_PASSWORD 环境变量且容器为重建后的新容器(旧容器仍用旧密码);并检查是否误删了 command 中的 --requirepass 参数。
10.5 容器重启后数据还在吗?
在:已开启 appendonly yes(AOF),docker compose restart / down 后 up -d 数据完整保留(实测验证)。只有 docker compose down -v 会删除卷数据。
10.6 如何自定义更多参数?
直接编辑 ./conf/redis.conf 追加参数(如 maxmemory、maxmemory-policy),然后 docker compose restart redis 即生效,无需改动 yaml。参数含义参考《Redis 8 配置参数详解》文档。
十一、参考链接
本文档由 www.quzuo.net 平台开发