欢迎光临
我们一直在努力

Docker 部署 Redis:小白一键安装、配置与迁移教程

🎯 本文适合人群:Docker 初学者、运维工程师、后端开发 ⏱️ 阅读时长:30分钟 📌 你将收获:掌握 Docker 部署 Redis 单机、主从、哨兵、集群的完整流程


📖 目录

  • 一、为什么用 Docker 部署 Redis
  • 二、Docker 环境准备
  • 三、单机 Redis 部署
  • 四、Docker Compose 部署
  • 五、主从复制部署
  • 六、哨兵模式部署
  • 七、集群模式部署
  • 八、数据迁移方案
  • 九、生产环境优化
  • 十、常见面试题

一、为什么用 Docker 部署 Redis

1.1 传统部署 vs Docker 部署

┌──────────────────────────────────────────────────┐
│ 传统部署 vs Docker 部署 │
├──────────────────────────────────────────────────┤
│ │
│ 传统部署: │
│ 1. 下载源码 → 编译 → 安装 → 配置 → 启动 │
│ 2. 依赖管理复杂(gcc、make、系统库) │
│ 3. 不同环境配置不一致 │
│ 4. 升级/回滚困难 │
│ 5. 多实例部署繁琐 │
│ │
│ Docker 部署: │
│ 1. docker run 一条命令启动 ✅ │
│ 2. 无依赖问题(镜像自带) │
│ 3. 环境一致(开发=测试=生产) │
│ 4. 秒级升级/回滚 │
│ 5. 轻松部署多实例 │
│ │
└──────────────────────────────────────────────────┘

1.2 Docker 部署的优势

优势说明示例
环境隔离 每个容器独立运行 同一台服务器运行多个 Redis 版本
快速部署 拉取镜像即可运行 docker run -d redis
资源限制 限制 CPU/内存 –memory=2g –cpus=2
易于迁移 镜像可在任何环境运行 开发 → 测试 → 生产
版本管理 随时切换版本 redis:7.0 ↔ redis:6.2
一键清理 删除容器即可 docker rm -f redis

二、Docker 环境准备

2.1 安装 Docker(CentOS 7)

# 1. 卸载旧版本
sudo yum remove -y docker docker-common docker-selinux docker-engine

# 2. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 3. 添加 Docker 官方仓库
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 国内用户推荐使用阿里云镜像
sudo yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 4. 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 5. 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 6. 验证安装
docker –version
# Docker version 24.0.7, build afdd53b

docker run hello-world
# Hello from Docker! ✅

2.2 配置 Docker 镜像加速

# 创建配置文件
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF

# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 5 "Registry Mirrors"

2.3 安装 Docker Compose

# 方式 1:官方脚本(推荐)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)–$(uname -m)" -o /usr/local/bin/docker-compose

# 国内镜像
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)–$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose –version
# Docker Compose version v2.24.0 ✅


三、单机 Redis 部署

3.1 快速启动(最简单)

# 1. 拉取 Redis 镜像(最新版本)
docker pull redis

# 2. 启动 Redis 容器
docker run -d \\
–name redis \\
-p 6379:6379 \\
redis

# 3. 验证运行
docker ps
# CONTAINER ID IMAGE COMMAND STATUS
# a1b2c3d4e5f6 redis "docker-entrypoint.s…" Up 10 seconds

# 4. 连接 Redis
docker exec -it redis redis-cli
127.0.0.1:6379> PING
PONG # ✅ 成功

参数说明:

  • -d:后台运行
  • –name redis:容器名称
  • -p 6379:6379:端口映射(宿主机:容器)

3.2 持久化部署(推荐)

# 1. 创建数据目录
mkdir -p /data/redis/{data,conf,logs}

# 2. 下载 Redis 配置文件
wget https://raw.githubusercontent.com/redis/redis/7.0/redis.conf -O /data/redis/conf/redis.conf

# 3. 修改配置文件
vim /data/redis/conf/redis.conf

关键配置修改:

# ========== 网络配置 ==========
bind 0.0.0.0 # 允许所有 IP 访问
protected-mode no # 关闭保护模式(或设置密码)

# ========== 密码配置 ==========
requirepass your_password_123 # 设置密码

# ========== 持久化配置 ==========
appendonly yes # 开启 AOF
appendfsync everysec # 每秒同步

save 900 1 # RDB 快照
save 300 10
save 60 10000

# ========== 日志配置 ==========
logfile "/data/redis/logs/redis.log"

# ========== 数据目录 ==========
dir /data/redis

# 4. 启动容器(挂载数据卷)
docker run -d \\
–name redis \\
-p 6379:6379 \\
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \\
-v /data/redis/data:/data \\
-v /data/redis/logs:/data/redis/logs \\
–restart=always \\
redis redis-server /usr/local/etc/redis/redis.conf

# 5. 验证持久化
docker exec -it redis redis-cli -a your_password_123
127.0.0.1:6379> SET test "hello"
OK

# 6. 检查数据文件
ls -lh /data/redis/data/
# appendonly.aof dump.rdb ✅

参数说明:

  • -v:挂载数据卷(宿主机:容器)
  • –restart=always:自动重启
  • redis-server /usr/local/etc/redis/redis.conf:使用自定义配置

3.3 资源限制(生产环境推荐)

docker run -d \\
–name redis \\
-p 6379:6379 \\
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \\
-v /data/redis/data:/data \\
–memory=2g \\
–memory-swap=2g \\
–cpus=2 \\
–restart=always \\
redis redis-server /usr/local/etc/redis/redis.conf

参数说明:

  • –memory=2g:限制内存 2GB
  • –memory-swap=2g:禁用 swap
  • –cpus=2:限制 CPU 核心数

四、Docker Compose 部署

4.1 单机部署

目录结构:

/data/redis/
├── docker-compose.yml
├── conf/
│ └── redis.conf
├── data/
└── logs/

docker-compose.yml:

version: '3.8'

services:
redis:
image: redis:7.0
container_name: redis
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "6379:6379"
volumes:
– ./conf/redis.conf:/usr/local/etc/redis/redis.conf
– ./data:/data
– ./logs:/data/redis/logs
environment:
– TZ=Asia/Shanghai
networks:
– redis–network
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G

networks:
redis-network:
driver: bridge

启动服务:

# 进入目录
cd /data/redis

# 启动
docker-compose up -d

# 查看日志
docker-compose logs -f redis

# 停止
docker-compose down

# 重启
docker-compose restart

4.2 多实例部署

docker-compose.yml(三个 Redis 实例):

version: '3.8'

services:
redis-6379:
image: redis:7.0
container_name: redis–6379
restart: always
command: redis–server ––port 6379 ––requirepass pass123
ports:
– "6379:6379"
volumes:
– ./data/redis–6379:/data
networks:
– redis–network

redis-6380:
image: redis:7.0
container_name: redis–6380
restart: always
command: redis–server ––port 6380 ––requirepass pass123
ports:
– "6380:6380"
volumes:
– ./data/redis–6380:/data
networks:
– redis–network

redis-6381:
image: redis:7.0
container_name: redis–6381
restart: always
command: redis–server ––port 6381 ––requirepass pass123
ports:
– "6381:6381"
volumes:
– ./data/redis–6381:/data
networks:
– redis–network

networks:
redis-network:
driver: bridge

# 启动
docker-compose up -d

# 查看
docker ps | grep redis
# redis-6379 ✅
# redis-6380 ✅
# redis-6381 ✅


五、主从复制部署

5.1 架构图

┌──────────────────────────────────────┐
│ Redis 主从复制架构 │
├──────────────────────────────────────┤
│ │
│ Master(主)6379 │
│ ↓ 数据同步 │
│ ┌────┴────┐ │
│ ↓ ↓ │
│ Slave1 6380 Slave2 6381 │
│ (从) (从) │
│ │
│ 写入:只能写 Master │
│ 读取:Master + Slave(读写分离) │
│ │
└──────────────────────────────────────┘

5.2 Docker Compose 配置

目录结构:

/data/redis-replication/
├── docker-compose.yml
├── master/
│ ├── redis.conf
│ └── data/
├── slave1/
│ ├── redis.conf
│ └── data/
└── slave2/
├── redis.conf
└── data/

master/redis.conf:

bind 0.0.0.0
port 6379
requirepass master_password_123
masterauth master_password_123 # 从节点连接主节点的密码

appendonly yes
appendfsync everysec

slave1/redis.conf:

bind 0.0.0.0
port 6380
requirepass slave_password_123
masterauth master_password_123 # 连接主节点的密码

# 指定主节点
replicaof redis-master 6379

# 从节点只读
replica-read-only yes

appendonly yes
appendfsync everysec

slave2/redis.conf(同 slave1,端口改为 6381)

docker-compose.yml:

version: '3.8'

services:
redis-master:
image: redis:7.0
container_name: redis–master
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "6379:6379"
volumes:
– ./master/redis.conf:/usr/local/etc/redis/redis.conf
– ./master/data:/data
networks:
– redis–replication

redis-slave1:
image: redis:7.0
container_name: redis–slave1
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "6380:6380"
volumes:
– ./slave1/redis.conf:/usr/local/etc/redis/redis.conf
– ./slave1/data:/data
depends_on:
– redis–master
networks:
– redis–replication

redis-slave2:
image: redis:7.0
container_name: redis–slave2
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "6381:6381"
volumes:
– ./slave2/redis.conf:/usr/local/etc/redis/redis.conf
– ./slave2/data:/data
depends_on:
– redis–master
networks:
– redis–replication

networks:
redis-replication:
driver: bridge

5.3 启动与验证

# 启动
docker-compose up -d

# 查看主节点信息
docker exec -it redis-master redis-cli -a master_password_123
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6380,state=online
slave1:ip=172.18.0.4,port=6381,state=online

# 测试主从同步
127.0.0.1:6379> SET name "张三"
OK

# 在从节点验证
docker exec -it redis-slave1 redis-cli -p 6380 -a slave_password_123
127.0.0.1:6380> GET name
"张三" # ✅ 同步成功

# 从节点无法写入
127.0.0.1:6380> SET age 25
(error) READONLY You can't write against a read only replica.


六、哨兵模式部署

6.1 架构图

┌──────────────────────────────────────────────┐
│ Redis 哨兵模式架构 │
├──────────────────────────────────────────────┤
│ │
│ Sentinel1 Sentinel2 Sentinel3 │
│ ↓ ↓ ↓ │
│ 监控 Master 和 Slave │
│ ↓ │
│ Master 宕机 → 自动故障转移 │
│ ↓ │
│ 选举一个 Slave 成为新 Master │
│ │
└──────────────────────────────────────────────┘

6.2 Docker Compose 配置

目录结构:

/data/redis-sentinel/
├── docker-compose.yml
├── master/
│ └── redis.conf
├── slave1/
│ └── redis.conf
├── slave2/
│ └── redis.conf
├── sentinel1/
│ └── sentinel.conf
├── sentinel2/
│ └── sentinel.conf
└── sentinel3/
└── sentinel.conf

sentinel1/sentinel.conf:

port 26379

# 监控主节点
# sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster master_password_123

# 主节点无响应超时时间(毫秒)
sentinel down-after-milliseconds mymaster 5000

# 故障转移超时时间
sentinel failover-timeout mymaster 10000

# 同时进行同步的从节点数量
sentinel parallel-syncs mymaster 1

sentinel2/sentinel.conf(端口改为 26380) sentinel3/sentinel.conf(端口改为 26381)

docker-compose.yml:

version: '3.8'

services:
redis-master:
image: redis:7.0
container_name: redis–master
restart: always
command: redis–server ––requirepass master_password_123 ––masterauth master_password_123
ports:
– "6379:6379"
networks:
– redis–sentinel

redis-slave1:
image: redis:7.0
container_name: redis–slave1
restart: always
command: redis–server ––replicaof redis–master 6379 ––requirepass slave_password_123 ––masterauth master_password_123
ports:
– "6380:6379"
depends_on:
– redis–master
networks:
– redis–sentinel

redis-slave2:
image: redis:7.0
container_name: redis–slave2
restart: always
command: redis–server ––replicaof redis–master 6379 ––requirepass slave_password_123 ––masterauth master_password_123
ports:
– "6381:6379"
depends_on:
– redis–master
networks:
– redis–sentinel

sentinel1:
image: redis:7.0
container_name: sentinel1
restart: always
command: redis–sentinel /usr/local/etc/redis/sentinel.conf
ports:
– "26379:26379"
volumes:
– ./sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel.conf
depends_on:
– redis–master
networks:
– redis–sentinel

sentinel2:
image: redis:7.0
container_name: sentinel2
restart: always
command: redis–sentinel /usr/local/etc/redis/sentinel.conf
ports:
– "26380:26380"
volumes:
– ./sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel.conf
depends_on:
– redis–master
networks:
– redis–sentinel

sentinel3:
image: redis:7.0
container_name: sentinel3
restart: always
command: redis–sentinel /usr/local/etc/redis/sentinel.conf
ports:
– "26381:26381"
volumes:
– ./sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel.conf
depends_on:
– redis–master
networks:
– redis–sentinel

networks:
redis-sentinel:
driver: bridge

6.3 验证与故障测试

# 启动
docker-compose up -d

# 查看哨兵信息
docker exec -it sentinel1 redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters
# name=mymaster,status=ok

127.0.0.1:26379> SENTINEL slaves mymaster
# 显示 2 个从节点

# 模拟主节点故障
docker stop redis-master

# 查看哨兵日志(自动故障转移)
docker logs -f sentinel1
# +sdown master mymaster 6379
# +odown master mymaster 6379
# +failover-end master mymaster
# +switch-master mymaster 172.18.0.2 6379 172.18.0.3 6379

# 验证新主节点
docker exec -it sentinel1 redis-cli -p 26379
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "172.18.0.3" # slave1 成为新主节点
2) "6379"


七、集群模式部署

7.1 架构图

┌────────────────────────────────────────────────┐
│ Redis Cluster 集群架构 │
├────────────────────────────────────────────────┤
│ │
│ 节点1(M) ←→ 节点2(M) ←→ 节点3(M) │
│ ↓ ↓ ↓ │
│ 节点4(S) 节点5(S) 节点6(S) │
│ │
│ M = Master(主节点,负责读写) │
│ S = Slave(从节点,备份和读) │
│ │
│ 数据分片:16384 个槽位分配到 3 个主节点 │
│ 高可用:每个主节点有一个从节点备份 │
│ │
└────────────────────────────────────────────────┘

7.2 Docker Compose 配置

目录结构:

/data/redis-cluster/
├── docker-compose.yml
├── redis-7001/
│ ├── redis.conf
│ └── data/
├── redis-7002/
│ ├── redis.conf
│ └── data/
├── redis-7003/
│ ├── redis.conf
│ └── data/
├── redis-7004/
│ ├── redis.conf
│ └── data/
├── redis-7005/
│ ├── redis.conf
│ └── data/
└── redis-7006/
├── redis.conf
└── data/

redis-7001/redis.conf:

port 7001
bind 0.0.0.0
protected-mode no

# 集群配置
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000

appendonly yes
appendfsync everysec

其他节点配置(端口改为对应的 7002-7006)

docker-compose.yml:

version: '3.8'

services:
redis-7001:
image: redis:7.0
container_name: redis–7001
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7001:7001"
– "17001:17001"
volumes:
– ./redis–7001/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7001/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.2

redis-7002:
image: redis:7.0
container_name: redis–7002
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7002:7002"
– "17002:17002"
volumes:
– ./redis–7002/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7002/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.3

redis-7003:
image: redis:7.0
container_name: redis–7003
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7003:7003"
– "17003:17003"
volumes:
– ./redis–7003/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7003/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.4

redis-7004:
image: redis:7.0
container_name: redis–7004
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7004:7004"
– "17004:17004"
volumes:
– ./redis–7004/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7004/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.5

redis-7005:
image: redis:7.0
container_name: redis–7005
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7005:7005"
– "17005:17005"
volumes:
– ./redis–7005/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7005/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.6

redis-7006:
image: redis:7.0
container_name: redis–7006
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "7006:7006"
– "17006:17006"
volumes:
– ./redis–7006/redis.conf:/usr/local/etc/redis/redis.conf
– ./redis–7006/data:/data
networks:
redis-cluster:
ipv4_address: 172.20.0.7

networks:
redis-cluster:
driver: bridge
ipam:
config:
– subnet: 172.20.0.0/16

7.3 创建集群

# 1. 启动所有节点
docker-compose up -d

# 2. 创建集群(进入任意容器)
docker exec -it redis-7001 redis-cli –cluster create \\
172.20.0.2:7001 \\
172.20.0.3:7002 \\
172.20.0.4:7003 \\
172.20.0.5:7004 \\
172.20.0.6:7005 \\
172.20.0.7:7006 \\
–cluster-replicas 1

# 输出:
# >>> Performing hash slots allocation on 6 nodes…
# Master[0] -> Slots 0 – 5460
# Master[1] -> Slots 5461 – 10922
# Master[2] -> Slots 10923 – 16383
# Can I set the above configuration? (type 'yes' to accept): yes

# 输入 yes 确认

# 3. 验证集群
docker exec -it redis-7001 redis-cli -c -p 7001
127.0.0.1:7001> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_size:3
cluster_known_nodes:6

127.0.0.1:7001> CLUSTER NODES
# 显示 6 个节点信息

# 4. 测试数据分片
127.0.0.1:7001> SET name "张三"
–> Redirected to slot [5798] located at 172.20.0.3:7002
OK # 自动重定向到对应节点


八、数据迁移方案

8.1 从传统 Redis 迁移到 Docker

方案 1:RDB 文件迁移

# 1. 在旧 Redis 生成 RDB 快照
redis-cli BGSAVE

# 2. 复制 RDB 文件到 Docker 数据目录
cp /var/lib/redis/dump.rdb /data/redis/data/

# 3. 启动 Docker Redis
docker run -d \\
–name redis \\
-p 6379:6379 \\
-v /data/redis/data:/data \\
redis

# 4. 验证数据
docker exec -it redis redis-cli
127.0.0.1:6379> DBSIZE
(integer) 1000000 # ✅ 数据已迁移

方案 2:AOF 文件迁移

# 1. 在旧 Redis 开启 AOF
redis-cli CONFIG SET appendonly yes
redis-cli BGREWRITEAOF

# 2. 复制 AOF 文件
cp /var/lib/redis/appendonly.aof /data/redis/data/

# 3. 修改配置文件
vim /data/redis/conf/redis.conf
appendonly yes

# 4. 启动 Docker Redis
docker run -d \\
–name redis \\
-p 6379:6379 \\
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \\
-v /data/redis/data:/data \\
redis redis-server /usr/local/etc/redis/redis.conf

8.2 在线迁移(主从同步)

# 1. Docker Redis 作为从节点
docker run -d \\
–name redis-slave \\
-p 6380:6379 \\
redis redis-server \\
–replicaof <旧Redis IP> 6379 \\
–masterauth <旧Redis密码>

# 2. 等待同步完成
docker exec -it redis-slave redis-cli
127.0.0.1:6379> INFO replication
master_link_status:up # ✅ 同步完成

# 3. 提升为主节点
127.0.0.1:6379> REPLICAOF NO ONE
OK

# 4. 切换应用连接到新 Redis
# 修改应用配置:127.0.0.1:6380

# 5. 停止旧 Redis

8.3 跨版本迁移

# 从 Redis 5.0 迁移到 7.0

# 1. 使用 redis-cli –rdb 导出
redis-cli –rdb dump.rdb

# 2. 启动 Redis 7.0
docker run -d \\
–name redis7 \\
-p 6379:6379 \\
-v /data/redis7/data:/data \\
redis:7.0

# 3. 导入数据
docker cp dump.rdb redis7:/data/
docker restart redis7


九、生产环境优化

9.1 性能优化配置

version: '3.8'

services:
redis:
image: redis:7.0
container_name: redis–prod
restart: always
command: redis–server /usr/local/etc/redis/redis.conf
ports:
– "6379:6379"
volumes:
– ./conf/redis.conf:/usr/local/etc/redis/redis.conf
– ./data:/data

# 资源限制
deploy:
resources:
limits:
cpus: '4'
memory: 8G
reservations:
cpus: '2'
memory: 4G

# 安全配置
security_opt:
– no–new–privileges:true

# 网络优化
sysctls:
net.core.somaxconn: 1024
vm.overcommit_memory: 1

# 健康检查
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s

# 日志配置
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "3"

networks:
– redis–prod

networks:
redis-prod:
driver: bridge

9.2 监控与告警

docker-compose.yml(Redis + Redis Exporter + Prometheus + Grafana):

version: '3.8'

services:
redis:
image: redis:7.0
container_name: redis
restart: always
command: redis–server ––requirepass redis_password_123
ports:
– "6379:6379"
networks:
– monitoring

redis-exporter:
image: oliver006/redis_exporter:latest
container_name: redis–exporter
restart: always
environment:
– REDIS_ADDR=redis:6379
– REDIS_PASSWORD=redis_password_123
ports:
– "9121:9121"
depends_on:
– redis
networks:
– monitoring

prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: always
command:
– '–config.file=/etc/prometheus/prometheus.yml'
ports:
– "9090:9090"
volumes:
– ./prometheus.yml:/etc/prometheus/prometheus.yml
networks:
– monitoring

grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
– "3000:3000"
environment:
– GF_SECURITY_ADMIN_PASSWORD=admin
networks:
– monitoring

networks:
monitoring:
driver: bridge

prometheus.yml:

global:
scrape_interval: 15s

scrape_configs:
– job_name: 'redis'
static_configs:
– targets: ['redis-exporter:9121']

9.3 备份脚本

#!/bin/bash
# docker-redis-backup.sh

CONTAINER_NAME="redis"
BACKUP_DIR="/backup/redis/$(date +%Y%m%d)"
RETENTION_DAYS=7

mkdir -p $BACKUP_DIR

# 触发 RDB 快照
docker exec $CONTAINER_NAME redis-cli BGSAVE

# 等待完成
sleep 10

# 复制文件
docker cp $CONTAINER_NAME:/data/dump.rdb $BACKUP_DIR/
docker cp $CONTAINER_NAME:/data/appendonly.aof $BACKUP_DIR/

# 压缩
cd $BACKUP_DIR
tar -czf redis_backup_$(date +%Y%m%d_%H%M%S).tar.gz *.rdb *.aof
rm -f *.rdb *.aof

# 删除旧备份
find /backup/redis/ -mtime +$RETENTION_DAYS -type d -exec rm -rf {} \\;

echo "Docker Redis backup completed: $BACKUP_DIR"


十、常见面试题

10.1 基础题

Q1:Docker 部署 Redis 有什么优势?

答案:

  • 环境一致性:开发、测试、生产环境完全一致
  • 快速部署:一条命令启动,无需编译安装
  • 资源隔离:限制 CPU/内存,避免资源竞争
  • 易于扩展:快速部署多实例、集群
  • 版本管理:随时切换 Redis 版本
  • 简化运维:统一管理、备份、监控
  • Q2:如何持久化 Docker Redis 的数据?

    答案: 使用 数据卷(Volume) 挂载:

    docker run -d \\
    –name redis \\
    -v /data/redis:/data \\
    redis

    关键点:

    • 数据存储在宿主机 /data/redis
    • 容器删除后数据仍保留
    • 便于备份和迁移
    Q3:Docker Redis 如何设置密码?

    答案:

    方式 1:命令行参数

    docker run -d \\
    –name redis \\
    redis redis-server –requirepass your_password

    方式 2:配置文件

    # redis.conf
    requirepass your_password

    docker run -d \\
    –name redis \\
    -v /path/to/redis.conf:/usr/local/etc/redis/redis.conf \\
    redis redis-server /usr/local/etc/redis/redis.conf


    10.2 进阶题

    Q4:如何用 Docker 部署 Redis 主从复制?

    答案:

    version: '3.8'

    services:
    master:
    image: redis:7.0
    command: redis–server ––requirepass master_pass
    ports:
    – "6379:6379"

    slave:
    image: redis:7.0
    command: redis–server ––replicaof master 6379 ––masterauth master_pass
    ports:
    – "6380:6379"
    depends_on:
    – master

    关键配置:

    • –replicaof <主机> <端口>:指定主节点
    • –masterauth <密码>:连接主节点的密码
    Q5:Docker Redis 集群如何实现高可用?

    答案:

    方案 1:哨兵模式(Sentinel)

    • 部署 3 个哨兵节点监控主从
    • 主节点故障自动故障转移
    • 适合中小规模(单主多从)

    方案 2:集群模式(Cluster)

    • 部署 6+ 节点(3主3从)
    • 数据分片到多个主节点
    • 主节点故障自动切换
    • 适合大规模(PB 级数据)

    选型:

    • 数据量 < 10GB → 主从 + 哨兵
    • 数据量 > 10GB → 集群模式
    Q6:如何限制 Docker Redis 的内存和 CPU?

    答案:

    docker run -d \\
    –name redis \\
    –memory=2g \\
    –memory-swap=2g \\
    –cpus=2 \\
    redis

    参数说明:

    • –memory=2g:限制内存 2GB
    • –memory-swap=2g:禁用 swap(等于 memory)
    • –cpus=2:限制 2 个 CPU 核心

    配合 Redis 配置:

    maxmemory 2gb
    maxmemory-policy allkeys-lru


    10.3 实战题

    Q7:生产环境 Docker Redis 如何备份?

    答案:

    1. 定时备份脚本:

    #!/bin/bash
    docker exec redis redis-cli BGSAVE
    sleep 10
    docker cp redis:/data/dump.rdb /backup/

    2. 定时任务:

    crontab -e
    0 2 * * * /usr/local/bin/docker-redis-backup.sh

    3. 远程备份:

    tar -czf redis_backup.tar.gz /backup/dump.rdb
    scp redis_backup.tar.gz user@remote:/backup/

    Q8:如何从传统 Redis 迁移到 Docker?

    答案:

    方案 1:停机迁移(RDB)

  • 旧 Redis 生成 RDB:redis-cli BGSAVE
  • 复制到 Docker 数据目录:cp dump.rdb /data/redis/
  • 启动 Docker Redis
  • 验证数据
  • 方案 2:在线迁移(主从同步)

  • Docker Redis 作为从节点连接旧 Redis
  • 等待数据同步完成
  • 提升 Docker Redis 为主节点
  • 切换应用连接
  • 方案 3:双写迁移

  • 应用同时写入旧 Redis 和 Docker Redis
  • 使用 Redis SCAN 增量迁移旧数据
  • 验证数据一致性
  • 切换读流量
  • Q9:Docker Redis 性能优化建议?

    答案:

    1. 使用宿主机网络:

    docker run -d –network host redis
    # 避免 Docker 网络转发开销

    2. 使用 SSD 存储数据卷:

    docker run -d -v /ssd/redis:/data redis

    3. 调整内核参数:

    sysctl -w vm.overcommit_memory=1
    echo never > /sys/kernel/mm/transparent_hugepage/enabled

    4. 限制日志大小:

    logging:
    driver: "json-file"
    options:
    max-size: "100m"
    max-file: "3"

    5. 禁用 swap:

    –memory-swap=<memory值>

    Q10:如何监控 Docker Redis?

    答案:

    1. Docker 命令监控:

    # CPU/内存使用率
    docker stats redis

    # 日志监控
    docker logs -f redis

    2. Redis 自带监控:

    docker exec -it redis redis-cli INFO
    docker exec -it redis redis-cli MONITOR

    3. Prometheus + Grafana:

    • 部署 redis_exporter 采集指标
    • Prometheus 存储时序数据
    • Grafana 可视化展示

    关键指标:

    • used_memory:内存使用
    • connected_clients:客户端连接数
    • instantaneous_ops_per_sec:QPS
    • keyspace_hits/misses:缓存命中率

    🎉 总结

    本文全面讲解了 Docker 部署 Redis:

    ✅ 单机部署:快速启动、持久化、资源限制 ✅ Docker Compose:优雅编排、多实例管理 ✅ 主从复制:读写分离、数据冗余 ✅ 哨兵模式:自动故障转移、高可用 ✅ 集群模式:数据分片、水平扩展 ✅ 数据迁移:RDB/AOF/主从同步迁移 ✅ 生产优化:性能调优、监控告警、备份策略 ✅ 面试宝典:10 道高频 Docker Redis 面试题


    📚 Redis 系列完结

    恭喜你完成 Redis 系列全部五篇博客!

  • ✅ Redis 入门与 CentOS 安装
  • ✅ Redis 基础命令速通
  • ✅ Redis 五大核心数据类型
  • ✅ Redis 持久化机制
  • ✅ Docker 部署 Redis

  • 💬 互动时间: 你在生产环境使用 Docker 部署 Redis 吗?遇到过什么坑?欢迎评论区分享! 👍 觉得有帮助,点个赞+收藏+关注三连吧~ 🎉

    赞(0)
    未经允许不得转载:171主机测评 » Docker 部署 Redis:小白一键安装、配置与迁移教程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址