用 Docker 安装并启动 Redis:从入门到实战
用 Docker 安装并启动 Redis:从入门到实战
Redis 作为一款高性能的键值对数据库,在缓存、会话存储、消息队列等场景中被广泛应用。本文将详细介绍如何使用 Docker 快速安装和启动 Redis,包括基础配置、数据持久化以及容器管理等核心操作,适合初学者快速上手。
一、准备工作:安装 Docker 环境
在开始之前,请确保你的系统已经安装了 Docker。如果尚未安装,可以按照以下步骤操作:
1. 安装 Docker(以 CentOS 为例)
bash
# 更新系统包
sudo yum update -y# 安装Docker依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker# 验证Docker是否安装成功
sudo docker --version
2. 非 root 用户配置(可选)
为了避免每次使用docker
命令都需要sudo
权限,可以将当前用户添加到docker
用户组:
bash
sudo usermod -aG docker $USER
# 生效配置(需要重新登录)
newgrp docker
二、Docker 安装 Redis:两种常用方式
方式 1:快速启动默认配置的 Redis
如果只需要临时使用 Redis 进行测试,最简单的方式是直接运行官方镜像:
bash
docker run --name redis-test -p 6379:6379 -d redis
参数说明:
--name redis-test
:给容器命名为redis-test
-p 6379:6379
:将主机的 6379 端口映射到容器的 6379 端口-d
:后台运行容器redis
:使用最新版本的 Redis 官方镜像
方式 2:自定义配置启动 Redis(推荐生产环境)
对于实际生产环境,我们需要自定义 Redis 配置(如设置密码、持久化策略等),并确保数据持久化到主机。
步骤 1:创建配置文件和数据目录
bash
# 创建存放Redis配置和数据的目录
mkdir -p /usr/local/redis/{conf,data}# 创建并编辑Redis配置文件
vi /usr/local/redis/conf/redis.conf
步骤 2:编写 Redis 配置文件
在redis.conf
中添加以下基础配置(根据需求调整):
conf
# bind 192.168.1.100 10.0.0.1
# 表示注释(该行不生效)。
#bind 用于指定 Redis 监听的网络接口地址(即允许哪些 IP 的客户端连接)。
#这里注释掉表示:不限制特定 IP,Redis 默认监听服务器上所有可用的网络接口(所有 IP 均可连接,除非受保护模式限制)。# bind 127.0.0.1 ::1
#同样是注释,127.0.0.1 是 IPv4 本地回环地址(仅本机可连接),::1 是 IPv6 本地回环地址。
#注释掉表示:Redis 不仅允许本地连接,还允许远程 IP 连接(需配合保护模式配置)。#bind 127.0.0.1
注释掉的单行本地回环地址绑定。若生效,Redis 仅允许本机(127.0.0.1)连接,拒绝所有远程请求。protected-mode no
#保护模式开关:no 表示关闭保护模式:允许外部网络连接(即使未绑定特定 IP 且未设置密码也能连接,生产环境不建议关闭)。
#若开启(yes),则仅允许本地连接,或需同时满足 “绑定了特定 IP” 和 “设置了密码” 才能远程连接。port 6379
#指定 Redis 服务监听的端口号,默认是 6379(Redis 官方默认端口)。tcp-backlog 511
#TCP 连接的 “待处理队列长度”:当客户端发起连接请求(三次握手完成后),会先进入该队列等待 Redis 处理。
#511 是默认值,实际生效值受系统内核参数(如net.core.somaxconn)限制。requirepass 123456
#设置 Redis 客户端连接的密码:客户端需通过 AUTH 123456 命令验证后才能操作 Redis(这里密码为123456,生产环境建议使用复杂密码)。timeout 0
#客户端空闲超时时间(单位:秒):若客户端超过该时间未发送任何命令,Redis 会主动关闭连接。
#0 表示不超时(客户端可一直保持连接)。tcp-keepalive 300
#TCP 保活机制(单位:秒):Redis 每 300 秒向客户端发送一次 TCP 保活探针,检测客户端是否仍在线(避免无效连接长期占用资源)。daemonize no
#是否以守护进程(后台)模式运行:
#no 表示在前台运行(日志直接输出到终端,关闭终端则 Redis 进程终止)。
#yes 表示在后台运行(需配合pidfile记录进程 ID)。supervised no
#指定 Redis 是否由系统管理进程(如 systemd、upstart)监控:
#no 表示不依赖任何系统管理进程。
#若为systemd,则 Redis 会配合 systemd 的进程管理机制运行。pidfile /var/run/redis_6379.pid
#当daemonize yes(守护进程模式)时,Redis 会将自身进程 ID(PID)写入该文件,用于系统管理(如停止服务时通过 PID 定位进程)。loglevel notice
#日志级别:控制日志输出的详细程度,可选值(从低到高):
#debug(调试信息,最详细)、verbose(详细信息)、notice(通知 + 警告 + 错误)、warning(警告 + 错误)、error(仅错误)。
#这里notice表示记录重要通知、警告和错误信息。logfile ""
#日志文件路径:
#空字符串("")表示日志输出到标准输出(终端)。
#若为守护进程模式,建议指定文件路径(如/var/log/redis.log),避免日志丢失。databases 1
#设置 Redis 默认创建的数据库数量:客户端可通过 SELECT <dbid> 命令切换数据库(编号从 0 到 29,默认 16 个库)。always-show-logo yes
#Redis 启动时是否显示 Logo:yes 表示显示 Redis 的 ASCII 艺术 Logo,no 表示不显示。save 900 1
#RDB 持久化触发条件:900 秒(15 分钟)内有至少 1 个键被修改,则自动执行bgsave生成 RDB 快照。save 300 10
#RDB 触发条件:300 秒(5 分钟)内有至少 10 个键被修改,自动生成 RDB 快照。save 60 10000
#RDB 触发条件:60 秒(1 分钟)内有至少 10000 个键被修改,自动生成 RDB 快照。stop-writes-on-bgsave-error yes
#当 RDB 持久化(bgsave)失败时,是否停止 Redis 接收写入操作:
#yes 表示停止(防止数据丢失,强制人工处理错误)。
#no 表示继续接收写入(可能导致数据无法持久化,有风险)。rdbcompression yes
#是否对 RDB 文件进行压缩:
#yes 表示压缩(节省磁盘空间,但消耗 CPU)。
#no 表示不压缩(节省 CPU,但文件更大)。rdbchecksum yes
#是否在 RDB 文件末尾添加校验和:
#yes 表示添加(用于验证 RDB 文件完整性,增加少量 CPU 消耗)。
#no 表示不添加(节省 CPU,但无法检测文件损坏)。dbfilename dump.rdb
#RDB 持久化文件的名称(默认dump.rdb),存储路径由dir参数指定。dir ./
#RDB 和 AOF 文件的存储目录:./ 表示 Redis 启动时的当前工作目录(建议指定绝对路径,如/var/lib/redis)。replica-serve-stale-data yes
#从节点(replica)与主节点(master)断开连接时,是否继续响应客户端请求:
#yes 表示继续(返回旧数据,保证可用性)。
#no 表示仅响应INFO和SLAVEOF命令,拒绝其他请求(保证数据一致性)。replica-read-only yes
#从节点是否为只读模式:yes 表示从节点不能执行写入操作(仅主节点可写,保证主从数据一致)。repl-diskless-sync no
#是否启用 “无盘复制”(主节点向从节点同步数据时不写入磁盘):
#no 表示不启用(传统方式:主节点生成 RDB 文件写入磁盘,再发送给从节点)。
#yes 表示启用(主节点直接通过网络发送 RDB 数据给从节点,节省磁盘 IO,适合网络快的场景)。repl-disable-tcp-nodelay no
#是否禁用 TCP_NODELAY 选项(影响主从数据同步的延迟):
#no 表示不禁用(数据立即发送,延迟低但带宽消耗高)。
#yes 表示禁用(数据会合并成大包发送,带宽低但延迟高)。replica-priority 100
#从节点的优先级(用于主从切换时选举新主节点):
#值越小优先级越高(0 表示该从节点不能成为主节点)。lazyfree-lazy-eviction no
#内存满时驱逐键(根据 maxmemory-policy)是否使用 “惰性删除”(后台异步删除,不阻塞主线程):no 表示立即删除(可能阻塞)。lazyfree-lazy-expire no
#键过期时是否使用惰性删除:no 表示立即删除(可能阻塞)。lazyfree-lazy-server-del no
#执行DEL命令删除大量数据时是否使用惰性删除:no 表示立即删除(可能阻塞)。replica-lazy-flush no
#从节点同步主节点数据前,清空自身数据是否使用惰性删除:no 表示立即清空(可能阻塞)。appendonly yes
#是否启用 AOF(Append Only File)持久化:
#yes 表示启用(记录所有写命令到 AOF 文件,用于恢复数据,比 RDB 更完整)。
#no 表示禁用(仅使用 RDB 持久化)。appendfilename "appendonly.aof"
#AOF 文件的名称(默认appendonly.aof),存储路径由dir参数指定。no-appendfsync-on-rewrite no
#AOF 重写期间是否禁用appendfsync(控制 AOF 文件刷盘策略):
#no 表示不禁用(每写入命令都刷盘,保证数据安全,但影响性能)。
#yes 表示禁用(重写期间不刷盘,提升性能,但可能丢失这段时间的数据)。auto-aof-rewrite-percentage 100
#AOF 自动重写的触发条件之一:当 AOF 文件大小超过 “上次重写后大小” 的 100%(即翻倍)时,触发重写(重写是为了压缩 AOF 文件,去除冗余命令)。auto-aof-rewrite-min-size 64mb
#AOF 自动重写的触发条件之二:AOF 文件大小至少达到 64MB 时,才可能触发重写(避免小文件频繁重写)。aof-load-truncated yes
#当 AOF 文件末尾被截断(如 Redis 崩溃导致),加载时是否继续:
#yes 表示继续加载(忽略截断部分,记录警告)。
#no 表示拒绝加载(需手动修复 AOF 文件)。aof-use-rdb-preamble yes
#是否启用 “混合持久化”:yes 表示 AOF 文件开头包含 RDB 格式数据,后续是增量 AOF 命令(结合 RDB 加载快和 AOF 数据完整的优点)。lua-time-limit 5000
#Lua 脚本的最大执行时间(单位:毫秒):超过 5000 毫秒(5 秒)的脚本会被强制终止,避免阻塞 Redis。slowlog-max-len 128
#慢查询日志的最大条目数:记录执行时间超过slowlog-log-slower-than(默认 10 毫秒)的命令,超过 128 条时会删除最旧的条目。notify-keyspace-events ""
#键空间通知配置:空字符串表示禁用通知(不发送任何事件)。若需开启(如键过期通知),可设置为特定字符(如"Ex"表示键过期事件)。hash-max-ziplist-entries 512
#哈希类型使用 “压缩列表(ziplist)” 存储的条件:当哈希的字段数≤512 时,用 ziplist(节省空间);否则转为哈希表(hashtable)。hash-max-ziplist-value 64
#哈希类型使用 ziplist 的补充条件:每个字段和值的长度≤64 字节(否则转为哈希表)。list-max-ziplist-size -2
#列表类型使用 ziplist 存储的最大内存:-2 表示以字节为单位,值为 8KB(超过则转为双向链表 linkedlist)。list-compress-depth 0
#列表的压缩深度:0 表示不压缩任何节点;1 表示压缩表头和表尾各 1 个节点;2 表示各 2 个,以此类推(节省空间)。set-max-intset-entries 512
#集合类型使用 “整数集合(intset)” 存储的条件:元素全为整数且数量≤512 时,用 intset(节省空间);否则转为哈希表。zset-max-ziplist-entries 128
#有序集合使用 ziplist 存储的条件:元素数≤128 时,用 ziplist;否则转为跳表(skiplist)。zset-max-ziplist-value 64
#有序集合使用 ziplist 的补充条件:每个元素的成员(member)长度≤64 字节(否则转为跳表)。hll-sparse-max-bytes 3000
#HyperLogLog 类型(用于基数统计)的稀疏表示最大字节数:超过 3000 字节时转为稠密表示(平衡空间和性能)。stream-node-max-bytes 4096
#流(stream)类型中每个节点的最大字节数:超过 4096 字节时拆分节点(优化流的存储和查询)。stream-node-max-entries 100
#流类型中每个节点的最大条目数:超过 100 条时拆分节点。activerehashing yes
#是否启用主动重哈希:yes 表示 Redis 定期对哈希表进行重哈希(优化哈希表性能,避免查询效率下降)。hz 10
#Redis 内部定时任务的执行频率(单位:赫兹):10 表示每秒执行 10 次,影响过期键删除、客户端超时检测等(值越高,响应越及时,但 CPU 消耗越高)。dynamic-hz yes
#是否动态调整hz值:yes 表示 Redis 空闲时降低hz(节省 CPU),繁忙时提高hz(保证响应速度)。aof-rewrite-incremental-fsync yes
#AOF 重写时是否启用增量 fsync:yes 表示每写入 32MB 数据就刷盘一次(避免大量数据同时刷盘导致延迟)。rdb-save-incremental-fsync yes
#RDB 保存时是否启用增量 fsync:yes 表示每写入 32MB 数据就刷盘一次(优化 RDB 持久化的性能)。
步骤 3:启动 Redis 容器
bash
docker run -p 6379:6379 --name redis --restart=always \-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \-v /usr/local/redis/data:/data \-d redis redis-server /etc/redis/redis.conf \--appendonly yes --requirepass 123456
参数详解:
--restart=always
:容器退出时自动重启-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf
:挂载主机配置文件到容器-v /urs/local/redis/data:/data
:挂载数据目录,实现数据持久化redis-server /etc/redis/redis.conf
:指定使用挂载的配置文件启动 Redis--appendonly yes --requirepass 123456
:开启 AOF 持久化(--appendonly yes
)、设置密码(--requirepass 123456
)
三、验证 Redis 容器是否正常运行
1. 查看容器状态
bash
# 查看容器运行状态
docker ps | grep redis# 查看容器详细日志
docker logs redis
如果看到类似Ready to accept connections
的日志,说明 Redis 启动成功。
2. 连接 Redis 进行测试
bash
# 进入Redis容器
docker exec -it redis redis-cli# 输入密码(如果配置了密码)
127.0.0.1:6379> AUTH 123456# 测试设置和获取键值
127.0.0.1:6379> SET test "Hello Docker Redis"
OK
127.0.0.1:6379> GET test
"Hello Docker Redis"
四、Redis 容器管理常用命令
1. 基本操作
bash
# 启动已停止的Redis容器
docker start redis# 停止运行中的Redis容器
docker stop redis# 重启Redis容器
docker restart redis# 查看容器详细信息
docker inspect redis
2. 配置文件更新
当需要修改 Redis 配置时,只需更新主机上的/usr/local/redis/conf/redis.conf
文件,然后重启容器即可:
bash
# 编辑配置文件
vi /usr/local/redis/conf/redis.conf# 重启容器使配置生效
docker restart redis
3. 升级 Redis 版本
bash
# 停止并删除当前容器(数据已持久化到主机,不会丢失)
docker stop redis
docker rm redis# 拉取新版本镜像
docker pull redis:latest# 使用相同命令启动新容器
docker run -d \--name redis \--restart=always \-p 6379:6379 \-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \-v /usr/local/redis/data:/data \redis:latest \redis-server /etc/redis/redis.conf
五、安全最佳实践
- 设置强密码:务必在配置文件中通过
requirepass
设置复杂密码 - 限制网络访问:生产环境建议通过
bind
参数限制允许连接的 IP,或通过防火墙控制访问 - 定期备份数据:虽然数据已持久化到主机,仍建议定期备份
/usr/redis/data
目录 - 使用固定版本镜像:生产环境避免使用
latest
标签,应指定具体版本(如redis:7.2.4
) - 最小权限原则:运行容器时可考虑添加
--user
参数指定非 root 用户运行
六、常见问题解决
1. 容器启动后立即退出
检查日志定位问题:
bash
docker logs redis
常见原因:配置文件错误、目录权限不足(可尝试chmod 777 /opt/redis/data
临时测试)
2. 无法远程连接 Redis
- 检查主机防火墙是否开放 6379 端口
- 确认 Redis 配置中
protected-mode
已设为no
(或已正确配置bind
参数) - 检查连接密码是否正确
3. 数据持久化失败
- 确认挂载目录权限正确
- 检查配置文件中
dir
参数是否指向/data
- 查看 Redis 日志中是否有持久化相关错误
总结
通过 Docker 安装 Redis 可以极大简化部署过程,同时保证环境一致性。本文介绍的方法既适用于开发测试环境,也可通过适当调整配置应用于生产环境。核心在于理解数据持久化的实现方式和容器与主机的交互机制,以便更好地管理和维护 Redis 服务。