Redis 8 Docker Compose 部署指南

使用 Docker Compose 一键部署 Redis 8(官方镜像 `redis:8`),涵盖数据目录持久化、**配置文件持久化(conf 挂载)**、密码注入、AOF 持久化与健康检查,并给出等价的 `docker run` 运行方式。本文档已在 `/opt/data/ops/redis` 目录实测通过(容器 healthy、重启数据保留、密码认...

RedisRedis安装部署容器化KV存储NoSQL2026/09/27

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:8Redis 8(当前最新稳定系列)官方维护,含全部小版本安全修复
redis:7Redis 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)

配置项默认值说明
bind0.0.0.0监听所有网卡,配合端口映射供外部连接(密码保护)
port6379容器内监听端口(对外映射 16379)
dir/data数据目录,与数据卷 ./data:/data 对应
appendonlyyes开启 AOF 追加持久化,重启数据不丢失
appendfsynceverysecAOF 刷盘策略(always/everysec/no)
requirepass由命令行注入访问密码(conf 中未写死)
daemonizeno容器内必须为 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 平台开发