Docker 搭建Redis服务
一、搭建单节点服务
使用Docker搭建Redis单节点服务,其主要步骤如下:
- 拉取Redis官方镜像
- 运行Redis容器
- 进行基本配置(如设置密码、持久化等)
- 连接测试
1.1 拉取 Redis 镜像
首先,从镜像仓库拉取官方 Redis 镜像。可以选择指定版本标签,例如 redis:7.0,或者使用默认的 latest 标签。
docker pull redis:latest
1.2 运行 Redis 容器
1. 快速运行
最简单的运行方式是不带任何配置,使用默认参数:
docker run -d --name my-redis redis:latest
2. 数据持久化运行
在主机上创建数据目录,运行容器的时候将 Redis 的数据目录挂载到该目录上。这样即使容器被删除,数据也不会丢失。
mkdir -p /usr/local/src/redis/data
docker run -d --name my-redis \
-p 6379:6379 \
-v /usr/local/src/redis/data:/data \
redis:latest
3. 使用自定义配置运行
在主机上创建自定义配置文件目录,然后在这个自定义配置文件目录中创建一个redis配置文件(比如redis.conf),可以在其中设置密码、持久化等。
运行容器时,将配置文件挂载到容器内,并指定使用该配置文件。
# 1.创建配置文件目录
mkdir -p /usr/local/src/redis/conf
# 2.创建 redis.conf 配置文件
cat > /usr/local/src/redis/conf/redis.conf << EOF
# 绑定地址
bind 0.0.0.0
# 端口
port 6379
# 密码认证
requirepass root123
# 数据持久化
save 900 1
save 300 10
save 60 10000
# 数据存储目录
dir /data
# 日志级别
loglevel notice
# 最大内存
maxmemory 512mb
maxmemory-policy allkeys-lru
# 网络配置
timeout 300
tcp-keepalive 60
# 保护模式
protected-mode no
EOF
# 3. 使用自定义配置运行
docker run -d --name my-redis \
-p 6379:6379 \
-v /usr/local/src/redis/data:/data \
-v /usr/local/src/redis/conf/redis.conf:/etc/redis/redis.conf \
redis:latest \
redis-server /etc/redis/redis.conf
4. 设置密码
- 在 redis.conf 配置文件中设置:
requirepass yourpassword - 运行容器时设置:
运行容器时设置密码会覆盖配置文件中相应的设置。# 通过--requirepass设置密码 docker run --name my-redis -d redis:latest --requirepass "yourpassword"
5. 端口映射
默认情况下,Redis 容器会在内部监听 6379 端口。如果你想从宿主机访问 Redis,需要将容器的 6379 端口映射到宿主机的一个端口。
# 通过 -p 设置端口映射,6380为宿主机的端口,6379 为Redis 容器内部端口
docker run --name my-redis -d -p 6380:6379 redis:latest
1.3 连接 Redis
-
使用redis-cli连接
# 使用 redis-cli 连接 docker exec -it my-redis redis-cli # 带密码连接 docker exec -it my-redis redis-cli -a your_password # 从外部连接 redis-cli -h localhost -p 6379 -a your_password -
使用可视化工具连接

1.4 备份与恢复
# 备份数据
docker exec my-redis redis-cli SAVE
docker cp my-redis:/data/dump.rdb ./backup/
# 恢复数据
docker cp ./backup/dump.rdb my-redis:/data/
docker restart my-redis
二、搭建Redis集群
Redis 集群主要包括主从复制、哨兵模式和 Cluster 集群模式,这三种Redis 集群方案各有优势:
- 主从复制:简单易用,适合读写分离场景。
- 哨兵模式:提供高可用性,自动故障转移。
- Cluster 模式:真正的分布式,支持数据分片和高可用。
这里使用Docker Compose来简化各个节点的部署操作。首先,创建一个目录,比如redis-cluster,然后在该目录下创建以下文件:
- docker-compose.yml 用于定义和运行多个Redis容器。
- 一个用于生成Redis配置文件的脚本,或者直接在docker-compose中配置。
2.1 Redis 主从复制模式
2.1.1 创建目录和配置文件
首先进入到上面创建的redis-cluster集群目录下,去创建各个节点的数据挂载目录以及配置文件。
-
创建主从节点的数据挂载目录
# 创建目录结构 mkdir -p {master,slave1,slave2}/data -
创建主从节点的配置文件
- 主节点配置 (master/redis.conf):
port 6379 bind 0.0.0.0 # 允许来自任何IP的连接,根据安全需求可以限制为特定IP。 requirepass redis123 masterauth redis123 appendonly yes appendfilename "appendonly.aof" dir /data - 从节点配置 (slave1/redis.conf 和 slave2/redis.conf):
port 6379 bind 0.0.0.0 # 允许来自任何IP的连接,根据安全需求可以限制为特定IP。 requirepass redis123 # 从节点自己的密码(客户端连接从节点时使用) masterauth redis123 # 连接主节点时使用的密码(必须与主节点的requirepass一致) replicaof redis-master 6379 # 通过主节点的容器名和端口连接 appendonly yes appendfilename "appendonly.aof" dir /data
- 主节点配置 (master/redis.conf):
2.1.2 Docker Compose 配置
在redis-cluster目录中创建 docker-compose.yml:
version: '3.8'
services:
# Redis 主节点
redis-master:
image: redis:latest
container_name: redis-master
ports:
- "6379:6379"
volumes:
- ./master/data:/data
- ./master/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
# Redis 从节点 1
redis-slave-1:
image: redis:latest
container_name: redis-slave-1
ports:
- "6380:6379"
volumes:
- ./slave1/data:/data
- ./slave1/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
depends_on:
- redis-master
networks:
- redis-net
# Redis 从节点 2
redis-slave-2:
image: redis:latest
container_name: redis-slave-2
ports:
- "6381:6379"
volumes:
- ./slave2/data:/data
- ./slave2/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
depends_on:
- redis-master
networks:
- redis-net
networks:
redis-net:
driver: bridge
2.1.3 启动和验证
# 启动服务
docker-compose -f docker-compose.yml up -d
# 验证服务状态
docker ps
# 测试主从复制
docker exec redis-master redis-cli -a master_password info replication
# 测试数据同步
docker exec redis-master redis-cli -a master_password set test "hello"
docker exec redis-slave-1 redis-cli -a master_password get test
docker exec redis-slave-2 redis-cli -a master_password get test
2.1.4 清理和重新启动
如果之前启动失败,需要先清理:
# 停止并删除容器
docker-compose -f docker-compose.yml down
# 删除网络(如果需要)
docker network prune
# 重新启动
docker-compose -f docker-compose.yml up -d
2.2 Redis Sentinel 哨兵模式
Redis 的哨兵集群主要是在主从复制集群的前提下再加入Sentinel节点。所以搭建哨兵集群可直接在之前搭建主从复制模式下在加入Sentinel节点的配置,在docker-compose的启动文件中加入Sentinel节点的启动信息就好。
2.2.1 创建 Sentinel 目录
进入到redis-cluster目录中创建 Sentinel 的目录:
mkdir sentinel
2.2.2 Sentinel 配置
进入到sentinel目录中创建各个Sentinel的配置文件:
-
sentinel/sentinel1.conf
port 26379 bind 0.0.0.0 sentinel monitor mymaster redis-master 6379 2 sentinel auth-pass mymaster redis123 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 10000 sentinel resolve-hostnames yes dir /tmp -
sentinel/sentinel2.conf
port 26379 bind 0.0.0.0 sentinel monitor mymaster redis-master 6379 2 sentinel auth-pass mymaster redis123 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 10000 sentinel resolve-hostnames yes dir /tmp -
sentinel/sentinel3.conf
port 26379 bind 0.0.0.0 sentinel monitor mymaster redis-master 6379 2 sentinel auth-pass mymaster redis123 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 10000 sentinel resolve-hostnames yes dir /tmp -
port 26379: Sentinel实例运行的端口,默认为26379。
-
bind 0.0.0.0: 允许来自任何IP的连接,根据安全需求可以限制为特定IP。
-
sentinel monitor mymaster redis-master 6379 2:
- mymaster 是主节点的名称,可以自定义。
- redis-master 是主节点的地址,这里使用容器名,因为Sentinel和Redis在同一个Docker网络中,可以通过容器名解析。
- 6379 是主节点的端口。
- 2 是法定人数(quorum),表示至少需要2个Sentinel节点同意才能判断主节点故障并启动故障转移。
-
sentinel auth-pass mymaster redis123:
- 如果Redis主节点和从节点设置了密码,那么Sentinel需要配置这个密码来连接Redis节点。
- mymaster 是主节点名称,与上面一致。
- redis123 是Redis节点的密码,这里主从节点使用同一密码。
-
sentinel down-after-milliseconds mymaster 5000:
- Sentinel认为主节点不可用(下线)的时间阈值,单位为毫秒。
- 如果Sentinel在5000毫秒(5秒)内没有收到主节点的有效回复,就会认为主节点主观下线(SDOWN)。
-
sentinel parallel-syncs mymaster 1:
- 在故障转移后,同时允许多少个从节点向新的主节点同步数据。
- 设置为1,表示每次只允许一个从节点同步,这可以减少新主节点的压力。
-
sentinel failover-timeout mymaster 10000:
- 故障转移的超时时间,单位为毫秒。
- 在这个时间内,如果故障转移没有完成,Sentinel会重新尝试故障转移。
-
sentinel resolve-hostnames yes: 允许Sentinel解析主机名,在Docker环境中,我们使用容器名,所以需要开启。
-
dir /tmp: Sentinel的工作目录,用于存储状态和日志。
2.2.2 Docker Compose 配置
version: '3.8'
services:
# Redis 主节点
redis-master:
image: redis:latest
container_name: redis-master
ports:
- "6379:6379"
volumes:
- ./master/data:/data
- ./master/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
- redis-net
# Redis 从节点 1
redis-slave-1:
image: redis:latest
container_name: redis-slave-1
ports:
- "6380:6379"
volumes:
- ./slave1/data:/data
- ./slave1/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
depends_on:
- redis-master
networks:
- redis-net
# Redis 从节点 2
redis-slave-2:
image: redis:latest
container_name: redis-slave-2
ports:
- "6381:6379"
volumes:
- ./slave2/data:/data
- ./slave2/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
depends_on:
- redis-master
networks:
- redis-net
# Sentinel 节点 1
redis-sentinel1:
image: redis:latest
container_name: redis-sentinel-1
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel/sentinel1.conf:/etc/redis/sentinel.conf
ports:
- "26379:26379"
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
networks:
- redis-net
# Sentinel 节点 2
redis-sentinel2:
image: redis:latest
container_name: redis-sentinel-2
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel/sentinel2.conf:/etc/redis/sentinel.conf
ports:
- "26380:26379"
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
networks:
- redis-net
# Sentinel 节点 3
redis-sentinel3:
image: redis:latest
container_name: redis-sentinel-3
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel/sentinel3.conf:/etc/redis/sentinel.conf
ports:
- "26381:26379"
depends_on:
- redis-master
- redis-slave-1
- redis-slave-2
networks:
- redis-net
networks:
redis-net:
driver: bridge
2.2.3 启动和测试故障转移
# 启动哨兵集群
docker-compose -f docker-compose.yml up -d
# 查看哨兵信息
docker exec redis-sentinel-1 redis-cli -p 26379 info sentinel
# 模拟主节点故障
docker stop redis-master
# 等待约 10-15 秒后检查新的主节点
docker exec redis-sentinel-1 redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
# 检查哪个从节点被提升为新的主节点
docker exec -it redis-slave-1 redis-cli -a redis123 info replication
docker exec -it redis-slave-2 redis-cli -a redis123 info replication
2.3 Redis Cluster 集群模式
由于Redis Cluster 集群至少需要3个主节点,并且通常为每个主节点配置一个从节点,因此至少需要6个节点。这里我们将使用Docker来搭建一个3主3从的Redis集群。各个节点最好是部署在不同的服务器上,这里全都部署在一台服务器上,分别赋予不同的端口。步骤:
- 创建各个节点目录以及配置文件
- 创建Docker Compose 配置文件来管理各个节点的容器
- 启动和初始化集群
- 验证集群状态
由于是在单机上部署,我们将使用不同的端口来区分节点。
主节点:7001, 7002, 7003
从节点:7004, 7005, 7006
项目结构:
redis-cluster/
├── docker-compose.yml
├── redis.conf
├── redis-7001/
│ └── data
├── redis-7002/
│ └── data
├── redis-7003/
│ └── data
├── redis-7004/
│ └── data
├── redis-7005/
│ └── data
└── redis-7006/
│ └── data
2.3.1 创建目录和配置文件
- 创建目录
进入到redis-cluster目录中创建各个节点的目录:# 清理并重新创建目录 rm -rf redis-700*/data mkdir -p redis-{7001,7002,7003,7004,7005,7006}/data # 设置权限 chmod -R 777 redis-*/data - 创建配置文件
进入到redis-cluster目录中创建redis.conf配置文件:port 6379 bind 0.0.0.0 protected-mode no requirepass redis123 masterauth redis123 # 集群配置 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 15000 cluster-require-full-coverage no cluster-replica-validity-factor 0 # 网络优化 tcp-backlog 1024 timeout 0 tcp-keepalive 300 # 内存配置 maxmemory 256mb maxmemory-policy allkeys-lru # 持久化配置 appendonly no save 900 1 save 300 10 save 60 10000 dir /data dbfilename dump.rdb
2.3.2 Docker Compose 配置
进入到redis-cluster目录中创建 docker-compose.yml:
version: '3.8'
services:
redis-7001:
image: redis:latest
container_name: redis-7001
ports:
- "7001:6379"
- "17001:16379"
volumes:
- ./redis-7001/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7001 --cluster-announce-bus-port 17001
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
redis-7002:
image: redis:latest
container_name: redis-7002
ports:
- "7002:6379"
- "17002:16379"
volumes:
- ./redis-7002/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7002 --cluster-announce-bus-port 17002
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
redis-7003:
image: redis:latest
container_name: redis-7003
ports:
- "7003:6379"
- "17003:16379"
volumes:
- ./redis-7003/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7003 --cluster-announce-bus-port 17003
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
redis-7004:
image: redis:latest
container_name: redis-7004
ports:
- "7004:6379"
- "17004:16379"
volumes:
- ./redis-7004/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7004 --cluster-announce-bus-port 17004
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
redis-7005:
image: redis:latest
container_name: redis-7005
ports:
- "7005:6379"
- "17005:16379"
volumes:
- ./redis-7005/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7005 --cluster-announce-bus-port 17005
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
redis-7006:
image: redis:latest
container_name: redis-7006
ports:
- "7006:6379"
- "17006:16379"
volumes:
- ./redis-7006/data:/data
- ./redis-cluster.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf --cluster-announce-ip 175.178.2.13 --cluster-announce-port 7006 --cluster-announce-bus-port 17006
environment:
- SKIP_FIX_PERMS=1
networks:
redis-cluster-net:
deploy:
resources:
limits:
memory: 300M
networks:
redis-cluster-net:
driver: bridge
2.3.3 创建和初始化集群
# 启动所有节点
docker-compose -f docker-compose.yml up -d
# 等待所有节点启动完成
sleep 10
# 创建集群(3主3从)
docker exec -it redis-7001 redis-cli -a redis123 --cluster create \
175.178.2.13:7001 \
175.178.2.13:7002 \
175.178.2.13:7003 \
175.178.2.13:7004 \
175.178.2.13:7005 \
175.178.2.13:7006 \
--cluster-replicas 1
# 输入 yes 确认配置
2.3.4 验证集群状态
# 检查集群状态
docker exec redis-7001 redis-cli -p 6379 -a redis123 cluster nodes
docker exec redis-7001 redis-cli -p 6379 -a redis123 cluster info
# 测试集群操作
docker exec redis-7001 redis-cli -p 6379 -a redis123 -c set key1 "hello"
docker exec redis-7001 redis-cli -p 6379 -a redis123 -c get key1
更多推荐
所有评论(0)