1. 创建网络和目录
# 创建自定义网络
docker network create redis-net
# 创建数据目录
mkdir -p ./redis/{master,slave1,slave2}
2. 启动主节点 (Master)
# 创建主节点配置文件
cat > ./redis/master/redis.conf << EOF
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
EOF
# 启动主节点
docker run -d \
--name redis-master \
--network redis-net \
-p 6379:6379 \
-v $(pwd)/redis/master/redis.conf:/usr/local/etc/redis/redis.conf \
-v $(pwd)/redis/master/data:/data \
redis:7-alpine \
redis-server /usr/local/etc/redis/redis.conf
3. 启动从节点 (Slave)
从节点1:
cat > ./redis/slave1/redis.conf << EOF
port 6380
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
replicaof redis-master 6379
EOF
docker run -d \
--name redis-slave1 \
--network redis-net \
-p 6380:6380 \
-v $(pwd)/redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf \
-v $(pwd)/redis/slave1/data:/data \
redis:7-alpine \
redis-server /usr/local/etc/redis/redis.conf \
--port 6380
从节点2:
cat > ./redis/slave2/redis.conf << EOF
port 6381
bind 0.0.0.0
protected-mode no
appendonly yes
requirepass 123456
masterauth 123456
replicaof redis-master 6379
EOF
docker run -d \
--name redis-slave2 \
--network redis-net \
-p 6381:6381 \
-v $(pwd)/redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf \
-v $(pwd)/redis/slave2/data:/data \
redis:7-alpine \
redis-server /usr/local/etc/redis/redis.conf \
--port 6381
4. 使用 Docker Compose 部署(推荐)
创建 docker-compose.yml:
version: '3.8'
services:
master:
image: redis:7-alpine
container_name: redis-master
ports:
- "6379:6379"
volumes:
- ./redis/master/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/master/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-net
slave1:
image: redis:7-alpine
container_name: redis-slave1
ports:
- "6380:6380"
volumes:
- ./redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/slave1/data:/data
command: redis-server /usr/local/etc/redis/redis.conf --port 6380
depends_on:
- master
networks:
- redis-net
slave2:
image: redis:7-alpine
container_name: redis-slave2
ports:
- "6381:6381"
volumes:
- ./redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/slave2/data:/data
command: redis-server /usr/local/etc/redis/redis.conf --port 6381
depends_on:
- master
networks:
- redis-net
networks:
redis-net:
driver: bridge
启动服务:
docker-compose up -d
5. 验证主从复制
# 连接到主节点
docker exec -it redis-master redis-cli -a 123456
# 在主节点执行
127.0.0.1:6379> INFO replication
# 查看 role:master 和 connected_slaves:2
# 测试数据同步
127.0.0.1:6379> SET test-key "Hello Replication"
127.0.0.1:6379> GET test-key
# 连接到从节点验证
docker exec -it redis-slave1 redis-cli -a 123456 -p 6380
127.0.0.1:6380> GET test-key
6. 故障转移测试
模拟主节点故障:
# 停止主节点
docker stop redis-master
# 手动提升从节点为主节点
docker exec -it redis-slave1 redis-cli -a 123456 -p 6380
127.0.0.1:6380> SLAVEOF NO ONE
127.0.0.1:6380> CONFIG SET requirepass 123456
# 配置另一个从节点连接到新的主节点
docker exec -it redis-slave2 redis-cli -a 123456 -p 6381
127.0.0.1:6381> SLAVEOF redis-slave1 6380
7. 常用命令
# 查看容器状态
docker ps
# 查看日志
docker logs redis-master
docker logs redis-slave1
# 停止所有服务
docker stop redis-master redis-slave1 redis-slave2
# 或使用 docker-compose
docker-compose down
# 清理数据
docker-compose down -v
8. 配置说明
- requirepass:Redis 认证密码
- masterauth:从节点连接主节点时的认证密码
- replicaof:指定主节点地址(Redis 5.0+)
- appendonly yes:启用 AOF 持久化
- protected-mode no:允许远程连接
这样就完成了 Redis 主从复制的 Docker 部署。可以根据需要调整配置参数,如持久化策略、内存限制等。