1. 场景说明

在日常的开发、测试乃至轻量级的生产环境中,Redis 都是不可或缺的高性能内存数据库。相比于传统的包管理工具(如 yum 或 apt)安装,使用 Docker Compose 部署 Redis 具有 环境隔离好、配置版本化、迁移成本低 的显著优势。

本文将演示如何使用 docker-compose 快速、优雅地拉起一个 Redis 服务,并一步到位地完成设置访问密码开启数据持久化(RDB + AOF)等核心配置,让你在享受容器化便利的同时,保障数据的安全性。

2. 环境准备

在开始操作之前,请确保您的服务器或本地机器已满足以下条件:

可以通过以下命令验证环境:

docker -v

docker compose version

3. 目录规划

养成良好的运维习惯,我们先为 Redis 服务规划一个干净的挂载目录。我们将创建三个子目录,分别用于存放配置、数据和日志:

# 创建工作主目录

mkdir -p /opt/docker/redis

cd /opt/docker/redis

# 创建配置、数据、日志目录

mkdir -p conf data logs

此时你的目录结构应当如下:

/opt/docker/redis/

├── conf/ # 存放 redis.conf 配置文件

├── data/ # 存放持久化的 RDB 和 AOF 数据文件

├── logs/ # 存放 Redis 运行日志

└── docker-compose.yml

4. 核心配置文件解析

4.1 准备 redis.conf

强烈建议不要使用纯命令行传参的方式,而是挂载 redis.conf 文件,这样更利于后续的调优和维护。

在我们的新建的 conf 目录下,创建一个基础的 redis.conf 文件:

vim conf/redis.conf

填入以下核心配置(您可以根据实际需求修改密码):

# 允许所有网络接口连接(容器内部需要设置为 0.0.0.0)

bind 0.0.0.0

# 关闭保护模式,使得外部网络可以访问连接

protected-mode no

# 设置 Redis 访问密码 (强烈建议修改为强密码)

requirepass YourStrongPassword123!

# 开启 AOF 数据持久化,确保数据不丢失

appendonly yes

appendfilename "appendonly.aof"

# AOF 同步策略:每秒同步一次(性能与安全的最佳折中)

appendfsync everysec

# 数据库文件存放目录(对应容器内的 /data)

dir /data

# 日志级别和日志文件路径

loglevel notice

logfile /logs/redis.log

# 设置最大内存限制(例如限制为 1GB,防止吃满宿主机内存)

maxmemory 1gb

# 达到最大内存后的淘汰策略(推荐 allkeys-lru)

maxmemory-policy allkeys-lru

4.2 编写 docker-compose.yml

回到主目录 /opt/docker/redis,创建 docker-compose.yml 文件:

version: '3.8'

services:
  redis:
    image: redis:7.2-alpine
    container_name: redis-server
    restart: always
    ports:
      - "6379:6379"
    volumes:
      # 映射配置文件
      - ./conf/redis.conf:/etc/redis/redis.conf
      # 映射数据目录
      - ./data:/data
      # 映射日志目录
      - ./logs:/logs
    # 指定启动时加载自定义配置文件
    command: ["redis-server", "/etc/redis/redis.conf"]
    # 设置时区,与宿主机保持一致
    environment:
      - TZ=Asia/Shanghai
    # 限制容器可以使用的资源 (可选)
    deploy:
      resources:
        limits:
          memory: 2G

经验总结 :这里推荐使用了 alpine 版本的 Redis 镜像(如 redis:7.2-alpine),它的体积非常小,包含的系统漏洞层面也更少,是生产环境的极佳选择。

5. 服务启动与验证

5.1 启动服务

进入 /opt/docker/redis 目录下,一条命令将服务放入后台启动:

docker compose up -d

查看容器的运行状态:

docker compose ps

如果 STATUS 显示为 Up,说明容器已成功运行。

5.2 验证服务与功能

我们需要验证几个关键点:进程是否正常、密码是否生效、挂载文件是否有数据。

验证连接与密码

使用 docker exec 进入容器内部使用 redis-cli 测试:

docker exec -it redis-server redis-cli -a YourStrongPassword123!

如果出现 Warning 是正常现象(提示密码在命令行不安全),进入交互界面后输入:

127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set mykey "hello docker"
OK
127.0.0.1:6379> get mykey
"hello docker"

验证持久化是否生效

退出 Redis 内部交互界面,回到宿主机查看我们刚才挂载的 data 目录:

ls -l ./data

如果你能看到 appendonly.aof dump.rdb 等文件或文件夹,说明数据持久化已经成功运作,即使重启或重建容器,刚才 set 的数据也不会丢失。

6. 常见问题排查(避坑指南)

1. 容器不断重启,看日志报 Permission denied

  • 现象:Redis 无法向挂载的 datalogs 目录写数据。

  • 原因:宿主机的目录权限不足,或者 LinuxSELinux 做了拦截。

  • 解决:赋予目录相应的权限 chmod -R 777 ./data ./logs,如果开启了 SELinux,在 docker-composevolumes 挂载路径后加上 :z,如 - ./data:/data:z

2. 宿主机连接不上 6379 端口

  • 排查路径:首先检查云服务器的安全组规则是否放行了 6379 端口;其次检查宿主机系统的防火墙(ufw / firewalld);最后检查配置文件中 bind 是否写死成了 127.0.0.1,必须为 0.0.0.0 才能对外提供访问。

7. 结语

使用 Docker Compose 部署 Redis 的最大好处在于 一切皆代码 (Infrastructure as Code)。当我们把 docker-compose.ymlredis.conf 提交到 Git 仓库后,无论是在新环境复刻,还是与团队共享,都只需要敲下 docker compose up -d 即可。

希望通过本文的拆解,不仅能够帮你在这个瞬间跑通 Redis 的部署,更希望这种将 配置、数据、日志分离挂载 的实践思路能对你有所启发。