Redis 数据库工程化部署安装流程
📌 文档说明 :本文档以 Docker 方式快速部署 Redis 7.2。为兼顾可读性,教程中直接使用了示例访问密码
redis123,便于初学者照做。生产环境请务必修改默认密码并收紧访问权限(详见下文「安全提醒」)。
目录
- 一、配置需求
- 二、大概流程简述
- 三、验证环节
- 四、具体流程(docker-compose 工程化部署)
- 五、常用管理命令
- 六、验证连接
- 七、备份与恢复
- 八、监控与告警
- 九、故障排查
- 十、升级与回滚
- 附录 A:安全加固清单
- 附录 B:配置参数速查表
一、配置需求
1. 系统要求
- 一台装了 Docker 的服务器
- 该服务器能与本地 win 电脑 ping 通
- 操作系统:Ubuntu 22.04(推荐)
2. 资源需求
- Redis 7.2 镜像(Docker 官方仓库)
- 国内的能用来拉取镜像的 docker 镜像源
3. 预备配置参数
| 参数 | 值 |
|---|---|
| 端口 | 6379 |
| 访问密码 | redis123 |
| 数据目录(宿主机) | /opt/redis/data |
| 配置目录(宿主机) | /opt/redis/conf |
| 备份目录(宿主机) | /opt/redis/backup |
二、大概流程简述
- 拉取官方 Redis 镜像
- 编写
redis.conf配置文件(持久化、内存策略、安全) - 编写
docker-compose.yml部署文件 - 调整宿主机内核参数(Redis 专用优化)
- 启动容器(含数据持久化、健康检查、资源限制、日志轮转)
- 验证连接
三、验证环节
1. 验证 Docker 环境
# 检查 Docker 是否安装
sudo docker --version
(如图所示结果)

显示类似 Docker version 24.03.1, build xxxx 就说明已安装。
# 检查 Docker 服务是否运行
sudo systemctl status docker
(如图所示结果)

看到 active (running) 就正常。
退出查看:ctrl+c
2. 验证镜像源是否能进行拉取镜像
# 拉取测试镜像
sudo docker pull hello-world
(失败结果如图所示)

(成功结果如图所示)

能正常运行就说明镜像源没问题。
如果拉取失败,配置国内 Docker 镜像加速器
创建文件
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
配置加速镜像 清空文件内容,写入以下 JSON(注意格式)
开始编写按:i
json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.anyhub.us.kg"
],
"dns": ["223.5.5.5", "114.114.114.114"]
}
退出编写+保存+退出:esc+:wq
应用配置
sudo systemctl daemon-reload
重启 docker
sudo systemctl restart docker
配置成功后,重新执行上面的拉取命令测试即可。
四、具体流程(docker-compose 工程化部署)
💡 本节使用
docker-compose将部署配置文件化,做到「一份配置,处处可起」,便于维护、复现与升级。密码仍沿用redis123(仅教程示例,生产请修改)。
1. 拉取 Redis 镜像
sudo docker pull redis:7.2
2. 准备部署目录
sudo mkdir -p /opt/redis/{data,conf,backup,logs}
cd /opt/redis
3. 调整宿主机内核参数(Redis 工程化关键)
Redis 对内核有两个硬性要求,不改会导致后台保存失败或性能下降:
# 1) 允许内存超分,否则 BGSAVE 可能因 fork 失败而报错
sudo sysctl -w vm.overcommit_memory=1
# 2) 增大最大连接数队列,避免高并发下连接被丢弃
sudo sysctl -w net.core.somaxconn=1024
# 3) 关闭透明大页 THP(会导致 fork 延迟飙升)
sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
写入配置使其重启后永久生效:
sudo tee -a /etc/sysctl.conf > /dev/null <<'EOF'
vm.overcommit_memory = 1
net.core.somaxconn = 1024
EOF
将 THP 关闭命令加入开机自启(rc.local 或 systemd 单元),避免重启后失效。
📌 说明:以上三项是 Redis 官方文档明确列出的生产建议,漏配往往在数据量上来后才暴露问题。
4. 编写 redis.conf
在 /opt/redis/conf/ 目录下创建 redis.conf:
sudo vim /opt/redis/conf/redis.conf
写入以下内容(开始编写按 i,退出按 esc+:wq):
ini
# /opt/redis/conf/redis.conf
################################# 网络 #################################
bind 0.0.0.0 # 允许外部访问;生产建议改为内网 IP
protected-mode yes # 保护模式:无密码时拒绝外部访问
port 6379
tcp-backlog 511
timeout 0 # 客户端空闲不主动断开
tcp-keepalive 300
################################# 通用 #################################
daemonize no # 容器内必须为 no,由 Docker 管理前台进程
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
databases 16
################################# 安全 #################################
requirepass redis123 # 访问密码(示例,生产请用强密码)
# 禁用/重命名危险命令,防止误操作清空数据
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
################################# 内存 #################################
maxmemory 1gb # 上限按宿主机内存规划,预留缓冲
maxmemory-policy allkeys-lru # 达到上限后淘汰最近最少使用的 key
################################# 持久化(RDB) ########################
save 900 1 # 900s 内至少 1 个 key 变化则触发快照
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir /data # 容器内数据目录(与挂载点对应)
################################# 持久化(AOF) ########################
appendonly yes # 开启 AOF,数据更安全(默认 no)
appendfilename "appendonly.aof"
appendfsync everysec # 每秒刷盘,兼顾性能与安全
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
📌 说明 :
bind 0.0.0.0+requirepass必须配合使用;若密码为空则protected-mode会拒绝外部连接。
5. 授权目录属主
# 官方 redis 镜像内运行账户的 UID:GID 为 999:999
sudo chown -R 999:999 /opt/redis/data /opt/redis/conf /opt/redis/logs
📌 说明:授权后容器才有权读写挂载的数据与配置目录。
6. 编写 docker-compose.yml
在 /opt/redis/ 目录下创建 docker-compose.yml:
yaml
# /opt/redis/docker-compose.yml
services:
redis:
image: redis:7.2
container_name: redis_server
restart: unless-stopped # 宕机自动拉起,手动停止则不拉起
# 通过自定义配置启动;密码沿用 redis123(示例,生产请改强密码)
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
ports:
- "6379:6379" # 对外暴露端口;如仅需本机访问改为 "127.0.0.1:6379:6379"
volumes:
- /opt/redis/data:/data # 数据持久化(RDB + AOF)
- /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf # 挂载配置文件
- /opt/redis/logs:/logs # 预留日志目录
environment:
TZ: Asia/Shanghai
# 资源限制,避免单个容器拖垮宿主机
deploy:
resources:
limits:
cpus: '2.0'
memory: 2G
# 健康检查:容器假活时能被发现
healthcheck:
test: ["CMD", "redis-cli", "-a", "redis123", "ping"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
# 日志轮转,防止日志撑满磁盘
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
7. 启动服务
# 后台启动(老版本命令:sudo docker-compose up -d)
# 老版本不支持 docker compose(空格分隔)这个子命令。
sudo docker compose up -d
# 查看状态(等待片刻后 STATUS 应显示 healthy)
sudo docker compose ps
# 查看实时日志
sudo docker compose logs -f redis
8. 验证服务可用
sudo docker exec -it redis_server redis-cli -a redis123 ping
返回 PONG 即表示 Redis 正常工作。
⚠️ 安全提醒(务必阅读)
bind 0.0.0.0+ 弱密码redis123在公网环境极危险,历史上大量 Redis 被挖矿/勒索都是因此。生产环境务必修改为强密码 ,并将bind收紧为内网 IP。- 6379 端口不要直接暴露公网,应通过防火墙/安全组限制来源 IP。
- 禁用了
CONFIG命令后,所有配置变更必须改redis.conf后docker compose restart,避免线上被任意改配置。- 应用代码中不要硬编码密码,推荐使用环境变量或配置中心。
五、常用管理命令
以下命令均在
/opt/redis/目录(docker-compose.yml所在目录)下执行。
# 查看容器状态
sudo docker compose ps
# 查看实时日志
sudo docker compose logs -f redis
# 停止服务(保留数据)
sudo docker compose stop
# 启动服务
sudo docker compose start
# 重启服务(修改配置后使其生效)
sudo docker compose restart
# 进入容器内的 redis-cli
sudo docker exec -it redis_server redis-cli -a redis123
# 进入容器 shell 排查
sudo docker exec -it redis_server bash
# 停止并删除容器(数据目录 /opt/redis/data 保留,不会丢数据)
sudo docker compose down
# 修改 compose 或 redis.conf 后重新生效
sudo docker compose up -d
进入 redis-cli 后常用命令:
INFO # 查看服务综合信息(内存、连接、持久化)
DBSIZE # 当前库 key 数量
MEMORY USAGE <key> # 查看单个 key 占用内存
CONFIG GET maxmemory # 注意:本配置已禁用 CONFIG,仅供未禁用时参考
CLIENT LIST # 查看当前连接的客户端
SLOWLOG GET 10 # 查看最近 10 条慢查询
六、验证连接
1. 服务器本地验证
# 进入容器内部连接 Redis
sudo docker exec -it redis_server redis-cli -a redis123
(成功结果如图所示)
2. Windows 本地连接
使用 Python 测试连接
进入虚拟环境,安装 redis 库:
pip install redis
(成功结果如图所示)
创建测试脚本:
python
# test01.py
import redis
try:
r = redis.Redis(
host="192.168.1.128",
port=6379,
password="redis123",
decode_responses=True,
)
# 写入
r.set("hello", "redis-world")
# 读取
print("连接成功!hello =", r.get("hello"))
print("Redis 版本:", r.info()["redis_version"])
except Exception as e:
print("连接失败:", e)
finally:
r.close()
⚠️ 注意 :请将代码中的
192.168.1.128替换为您自己的服务器 IP 地址。
(成功结果如图所示)
运行脚本:
python test01.py
七、备份与恢复
Redis 的备份有两条路:RDB 快照 与 AOF 文件 ,二者都在 /opt/redis/data 中。没有备份等于裸奔。
1. 手动备份(物理文件拷贝)
最安全的方式是先触发 BGSAVE,再拷贝文件:
# 1) 触发后台保存,生成最新的 dump.rdb
sudo docker exec redis_server redis-cli -a redis123 BGSAVE
# 2) 等 BGSAVE 完成后拷贝到备份目录
sudo cp /opt/redis/data/dump.rdb /opt/redis/backup/dump_$(date +%F).rdb
sudo cp /opt/redis/data/appendonly.aof /opt/redis/backup/appendonly_$(date +%F).aof 2>/dev/null
📌 说明 :务必先
BGSAVE再拷贝,否则拷到的是上一次快照,可能丢最近写入。
2. 定时备份(crontab)
在宿主机执行 crontab -e,添加:
# 每天凌晨 2:30 触发 BGSAVE 并备份 RDB+AOF,保留最近 14 天
30 2 * * * docker exec redis_server redis-cli -a redis123 BGSAVE && sleep 30 && cp /opt/redis/data/dump.rdb /opt/redis/backup/dump_$(date +\%F).rdb && find /opt/redis/backup -name "dump_*.rdb" -mtime +14 -delete
⚠️ 注意 :crontab 中
%必须转义为\%,否则命令会被截断。
3. 恢复
# 1) 停止服务
cd /opt/redis && sudo docker compose stop
# 2) 用备份覆盖数据目录(清空前确认!)
sudo cp /opt/redis/backup/dump_2026-06-26.rdb /opt/redis/data/dump.rdb
# 若开启 AOF,建议同时覆盖 appendonly.aof 或先关闭 AOF 再用 RDB 恢复
# 3) 重新启动
sudo docker compose start
⚠️ 注意:恢复前请先停止业务写入;RDB 与 AOF 同时存在时 Redis 优先加载 AOF,若两者不一致以 AOF 为准。重要数据建议先在测试库演练。
八、监控与告警
容器跑起来不等于健康,需要持续监控。
1. 容器层面
# 实时资源占用
sudo docker stats redis_server
# 健康状态(compose 方式下已配置 healthcheck)
sudo docker inspect --format='{{.State.Health.Status}}' redis_server
2. Redis 层面(轻量方案)
进入 redis-cli 后执行:
# 综合信息(重点看 used_memory、connected_clients、rdb_last_bgsave_status)
INFO
# 内存使用详情
MEMORY STATS
# 连接的客户端列表
CLIENT LIST
# 最近慢查询
SLOWLOG GET 10
# 持久化失败计数(rdb_last_bgsave_status 应为 ok)
INFO persistence
重点关注指标:
| 指标 | 含义 | 健康信号 |
|---|---|---|
| used_memory | 已用内存 | 接近 maxmemory 需扩容或调淘汰策略 |
| connected_clients | 当前连接数 | 异常飙升可能为连接泄漏 |
| rdb_last_bgsave_status | 最近一次 RDB 结果 | 必须 ok |
| rejected_connections | 被拒连接数 | 持续 > 0 说明 somaxconn/并发超限 |
| keyspace_misses | 未命中次数 | 突增可能为缓存穿透 |
3. 专业监控(可选,进阶)
接入 redis_exporter + Prometheus + Grafana,可图形化监控内存、命中率、持久化延迟、主从复制状态等,并配置告警(邮件/钉钉/飞书)。
九、故障排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 容器启动后立即退出 | daemonize yes 导致无前台进程 |
redis.conf 中必须 daemonize no;查看 sudo docker compose logs redis |
连接提示 NOAUTH |
未带密码 / 密码错误 | redis-cli -a redis123,确认密码与 requirepass 一致 |
连接提示 MISCONF Redis is configured to save RDB... |
fork 失败,vm.overcommit_memory=0 |
执行 sudo sysctl -w vm.overcommit_memory=1 |
| 远程连接被拒绝 | 未监听 / 防火墙拦截 | 确认 bind 0.0.0.0;`ss -tlnp |
| 内存打满被频繁淘汰 | maxmemory 过小 / 大 key | INFO memory 查看;用 MEMORY USAGE 定位大 key |
| BGSAVE 卡顿/延迟高 | THP 未关闭 | 关闭透明大页:echo never > .../enabled |
| 磁盘写满 | AOF 文件/日志未轮转 | 配置 AOF 自动重写;确认 compose 已配 logging 轮转 |
启动报 Bad file descriptor |
redis.conf 路径或挂载错误 |
确认 volume 挂载与 dir /data 一致 |
常用排查命令汇总
# 看容器日志(最近 200 行)
sudo docker compose logs --tail 200 redis
# 进入容器排查
sudo docker exec -it redis_server bash
# 查看端口监听
ss -tlnp | grep 6379
# 查看磁盘空间
df -h
# 查看内核参数
sysctl vm.overcommit_memory net.core.somaxconn
cat /sys/kernel/mm/transparent_hugepage/enabled
十、升级与回滚
1. 升级前必做
# 1) 手动触发并备份(务必!)
sudo docker exec redis_server redis-cli -a redis123 BGSAVE
sleep 30
sudo cp /opt/redis/data/dump.rdb /opt/redis/backup/pre_upgrade_$(date +%F).rdb
# 2) 停止并删除旧容器(数据目录保留)
cd /opt/redis
sudo docker compose down
2. 升级(修改 compose 中的镜像版本)
修改 docker-compose.yml 中的 image: redis:7.2 为新版本(如 redis:7.4),然后:
sudo docker compose up -d
⚠️ 跨大版本升级(如 6.x → 7.x)需关注兼容性变更:Redis 7 默认开启 AOF 多文件格式(multi-part AOF),旧 AOF 文件会被自动迁移。升级前请阅读官方 Release Notes,并在测试库演练。小版本升级(7.2.4 → 7.2.5)通常可直接升级。
3. 回滚
若升级后异常:
cd /opt/redis
# 1) 将 docker-compose.yml 的 image 改回旧版本(如 redis:7.2)
# 2) 用备份恢复数据
sudo docker compose stop
sudo cp /opt/redis/backup/pre_upgrade_2026-06-26.rdb /opt/redis/data/dump.rdb
# 3) 重新启动
sudo docker compose start
附录 A:安全加固清单
生产环境上线前,逐项确认:
- 修改默认密码 :
requirepass使用 24 位以上强密码,禁用redis123 - 收紧 bind :
bind改为内网 IP,不要0.0.0.0暴露公网 - 网络隔离:6379 端口不直接暴露公网;通过防火墙/安全组限制来源 IP
- 禁用危险命令 :
FLUSHALL/FLUSHDB/CONFIG/KEYS重命名为空或随机串 - 开启 ACL(进阶) :Redis 6+ 支持
ACL,为不同应用分配独立账号与最小命令权限 - 启用持久化加密传输:跨网段访问建议 Stunnel/SSH 隧道或 Redis 6+ 的原生 TLS
- 内核三项 :
vm.overcommit_memory=1、somaxconn≥1024、关闭 THP - 凭证管理:密码通过环境变量/密钥管理服务注入,禁止硬编码进代码或镜像
- 定期备份 :开启定时备份并演练恢复,备份文件异地存储
- 版本补丁:关注 Redis 安全公告,及时升级小版本(如修复历史未授权访问 CVE)
附录 B:配置参数速查表
| 类别 | 参数 | 本文档取值 | 说明 |
|---|---|---|---|
| 连接 | 端口 | 6379 | 默认端口 |
| 连接 | 密码 | redis123 | 教程默认,生产必须修改 |
| 持久化 | 数据目录(宿主机) | /opt/redis/data | 绑定挂载路径 |
| 持久化 | 数据目录(容器内) | /data | Redis dir 指向 |
| 持久化 | RDB 文件 | dump.rdb | 快照文件 |
| 持久化 | AOF 文件 | appendonly.aof | 追加日志文件 |
| 持久化 | appendfsync | everysec | 每秒刷盘,兼顾性能与安全 |
| 内存 | maxmemory | 1gb | 上限按宿主机规划 |
| 内存 | 淘汰策略 | allkeys-lru | 达上限淘汰最近最少使用 |
| 部署 | compose 目录 | /opt/redis | docker-compose.yml 所在目录 |
| 部署 | 配置文件 | /opt/redis/conf/redis.conf | 自定义配置 |
| 镜像 | 版本 | redis:7.2 | 官方镜像 |
| 容器 | 名称 | redis_server | 本文档统一命名 |
| 重启 | 策略 | unless-stopped | 宕机自动拉起,手动停止不拉起 |
| 内核 | vm.overcommit_memory | 1 | 允许内存超分,避免 fork 失败 |
| 内核 | somaxconn | 1024 | 增大连接队列 |
| 内核 | THP | never | 关闭透明大页,降低 fork 延迟 |
| 时区 | TZ | Asia/Shanghai | 在 compose 中设置 |
📝 维护建议 :本文档内嵌了大量截图,导致文件体积较大。建议后续将图片迁移至
docs/images/目录并以相对路径引用,便于 Git 版本管理与团队协作。