docker 安装 redis

标签:Docker首次发布:2024-01-23最近修改:2026-08-19

redis 单机版

1. 拉取 redis 镜像并创建数据卷目录

使用 docker pull 命令拉取镜像。

bash
docker pull redis:7.0

在当前目录下创建 redisSave 目录用来持久化 redis 的数据。

bash
mkdir redisSave

2. 复制和修改 redis.conf

复制一份 redis 核心配置文件 redis.conf 到宿主机目录/root/redisSave 中。注:/opt/redis 下面的 redis.conf 是之间学习 redis 基础时就有的。

bash
[root@centos redisSave]# cp /opt/redis/redis.conf ./[root@centos redisSave]# lsredis.conf

现在要修改 redis.conf 文件。包括:

  1. 解除 IP 绑定:将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定。
  2. 关闭保护模式:将 protected-mode 设置为 no。
  3. 关闭守护模式:将 daemonize 设置为 no。
  4. 指定持久化目录:指定 RDB 或 AOF 的持久化目录(dir)为 /data 。后面也会指定容器中的/data 目录为数据卷挂载点目录。

修改完成后保存退出。

3. 启动 redis 容器

bash
[root@centos ~]# docker run --name redis7 \	-v /root/redisSave/redis.conf:/etc/redis/redis.conf \	-v /root/redisSave/data:/data \	-dp 6379:6379 redis:7.0 \	redis-server /etc/redis/redis.confeaba4560edf32bc5d257c972ef99a1ae9897950f7f2efacadec7808154d555e1[root@centos ~]#

这里指定了两个数据卷,其中一个是文件,一个是目录:

  • -v /root/redisSave/redis.conf:/etc/redis/redis.conf

  • -v /root/redisSave/data:/data

对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为挂载点目录/etc/redis 中的 redis.conf。

4. 进入容器并连接 redis

通过 docker exec 命令进入 Redis 容器后,就可通过 redis-cli 客户端连接上这个 Redis,然后执行 Redis 命令了。

bash
[root@centos ~]# docker exec -it redis7 /bin/bashroot@eaba4560edf3:/data# redis-cli127.0.0.1:6379>

redis 一主两从集群搭建

现要搭建一个“一主两从”的 Redis 集群。这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 6381、6382、6383。其中,6381 的为 master,另外两个为 slave。

1. 复制三份 redis.conf

现仍在前面的/root/redisSave 目录中完成配置。复制 redis.conf 并重命名为 redis6381.conf,并在文件最后添加如下配置,以对外宣布当前 redis 的 IP 与端口。注意,该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号。

bash
# 在redis6381.conf文件的末尾添加如下内容:slave-announce-ip 192.168.11.10slave-announce-port 6381

同理,再复制并修改 redis6382.conf。

bash
# 在redis6382.conf文件的末尾添加如下内容:slave-announce-ip 192.168.11.10slave-announce-port 6382

同理,再复制并修改 redis6383.conf。

bash
# 在redis6383.conf文件的末尾添加如下内容:slave-announce-ip 192.168.11.10slave-announce-port 6383

现在宿主机的/root/redisSave 目录的内容如下:

bash
[root@centos redisSave]# ll总用量 432drwxr-xr-x. 2 polkitd root     22 9月  17 16:57 data-rw-r--r--. 1 root    root 106652 9月  17 17:31 redis6381.conf-rw-r--r--. 1 root    root 106652 9月  17 17:32 redis6382.conf-rw-r--r--. 1 root    root 106652 9月  17 17:32 redis6383.conf-rw-r--r--. 1 root    root 106594 9月  17 16:56 redis.conf

2. 启动 master 和 slave

启动 master:

bash
[root@centos ~]# docker run --name redis-master \	-v /root/redisSave/redis6381.conf:/etc/redis/redis.conf \	-v /root/redisSave/data/6381:/data \	-dp 6381:6379 redis:7.0 \	redis-server /etc/redis/redis.conf8deef53276d429504257c9392cc8d126ba6758cecdcbfb01e1065fc07c29a871[root@centos ~]#

接下来就是启动两个 slave,需要注意:在启动 slave 的命令中需要指出其 slaveof 于谁。

bash
[root@centos ~]# docker run --name redis-slave1 \	-v /root/redisSave/redis6382.conf:/etc/redis/redis.conf \	-v /root/redisSave/data/6382:/data \	-dp 6382:6379 redis:7.0 \	redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 6381ada0a9c33698228d9f6c56a289bf712e26b5dc82081723a022a6fbf27689b4ed[root@centos ~]#

接下来还剩最后一个 slave。

bash
[root@centos ~]# docker run --name redis-slave2 \	-v /root/redisSave/redis6383.conf:/etc/redis/redis.conf \	-v /root/redisSave/data/6383:/data \	-dp 6383:6379 redis:7.0 \	redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 63810a565b94326b01b5c503ac489e7f58a91e5099619bbb8cdbebf31566824cbbda[root@centos ~]#

3. 查看关系和数据测试

查看这三个容器节点的 info replication,可以看到它们间的主从关系已经建立。

bash
[root@centos ~]# docker exec -it redis-master redis-cli info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.11.10,port=6382,state=online,offset=518,lag=1slave1:ip=192.168.11.10,port=6383,state=online,offset=518,lag=1master_failover_state:no-failovermaster_replid:7b8c2b34cac3c5aa426fc292232bf7dc07892b10master_replid2:0000000000000000000000000000000000000000master_repl_offset:518second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:518[root@centos ~]# docker exec -it redis-slave1 redis-cli info replication# Replicationrole:slavemaster_host:192.168.11.10master_port:6381master_link_status:upmaster_last_io_seconds_ago:1......[root@centos ~]# docker exec -it redis-slave2 redis-cli info replication# Replicationrole:slavemaster_host:192.168.11.10master_port:6381master_link_status:upmaster_last_io_seconds_ago:8......

可以看到 master 和 slave 之间的关系没有问题。现在插入数据进行测试。

bash
[root@centos ~]# docker exec -it redis-master redis-cli set name bingOK[root@centos ~]# docker exec -it redis-slave1 redis-cli get name"bing"[root@centos ~]# docker exec -it redis-slave2 redis-cli get name"bing"

发现数据测试也没问题,master 节点可读可写,slave 节点只能读。

redis 高可用集群搭建

主从集群存在的问题是,其容灾方式只能采用冷处理方案,无法在生产中使用。所以,这里要搭建一个“一主两从三哨兵”的高可用集群,以达到热处理的容灾方案。

对于“一主两从”集群,仍使用前面的即可。下面直接搭建三个 Sentinel 节点的集群。这三个容器的端口号都保持默认(26379),但对外暴露出的端口号分别为 26381、26382、26383。

1. 复制三份 sentinel.conf

复制 sentinel.conf 文件并重命名为 sentinel26381.conf。仅修改两处:

  • 指定其要监视的 master 及<quorum>。

  • 指定当前 sentinel 对外宣布的 IP 与端口号。其中 IP 为 docker 宿主机的 IP,端口号为其对外暴露的端口号。

bash
# 下面配置的数字:2有两层含义。# 第一层:当master节点宕机后,还剩两个节点,这两个节点要有过半数量的节点认为master宕机,才会被判定为master客观宕机。# 第二层:在master宕机后,在三个sentinel节点中,有一个会成为leader,成为leader的条件就是要有过半数量的sentinel认为某个sentinel能当上leader。sentinel monitor redis-master 192.168.11.10 6381 2sentinel announce-ip 192.168.11.10sentinel announce-port 26381

同理,再复制并修改 sentinel26382.conf。内容如下:

bash
sentinel monitor redis-master 192.168.11.10 6381 2sentinel announce-ip 192.168.11.10sentinel announce-port 26382

同理,再复制并修改 sentinel26383.conf。内容如下:

bash
sentinel monitor redis-master 192.168.11.10 6381 2sentinel announce-ip 192.168.11.10sentinel announce-port 26383

现在宿主机的/root/redisSave 目录的内容如下:

bash
[root@centos redisSave]# ll总用量 480drwxr-xr-x. 5 polkitd root     58 9月  17 17:54 data-rw-r--r--. 1 root    root 106652 9月  17 17:31 redis6381.conf-rw-r--r--. 1 root    root 106652 9月  17 17:32 redis6382.conf-rw-r--r--. 1 root    root 106652 9月  17 17:32 redis6383.conf-rw-r--r--. 1 root    root 106594 9月  17 16:56 redis.conf-rw-r--r--. 1 root    root  14078 9月  17 19:55 sentinel26381.conf-rw-r--r--. 1 root    root  14078 9月  17 19:54 sentinel26382.conf-rw-r--r--. 1 root    root  14078 9月  17 19:55 sentinel26383.conf

2. 启动 sentinel

启动三个 sentinel 容器。命令如下:

bash
# sentinel1的启动docker run --name sentinel1 \-v /root/redisSave/sentinel26381.conf:/etc/redis/sentinel.conf \-dp 26381:26379 redis:7.0 \redis-sentinel /etc/redis/sentinel.conf# sentinel2的启动docker run --name sentinel2 \-v /root/redisSave/sentinel26382.conf:/etc/redis/sentinel.conf \-dp 26382:26379 redis:7.0 \redis-sentinel /etc/redis/sentinel.conf# sentinel3的启动docker run --name sentinel3 \-v /root/redisSave/sentinel26383.conf:/etc/redis/sentinel.conf \-dp 26383:26379 redis:7.0 \redis-sentinel /etc/redis/sentinel.conf

需要注意的是,这里的 master 节点的名字是redis-master,所以 sentinel 文件中所有的 master 名字要和其保持一致。运行完成后查看运行的容器如下:

bash
[root@centos redisSave]# docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"CONTAINER ID   NAMES          STATUS          PORTS676e9920afaa   sentinel3      Up 2 minutes    6379/tcp, 0.0.0.0:26383->26379/tcp, :::26383->26379/tcpf311a9155e95   sentinel2      Up 3 minutes    6379/tcp, 0.0.0.0:26382->26379/tcp, :::26382->26379/tcpbaf6dd059549   sentinel1      Up 4 minutes    6379/tcp, 0.0.0.0:26381->26379/tcp, :::26381->26379/tcp0a565b94326b   redis-slave2   Up 17 minutes   0.0.0.0:6383->6379/tcp, :::6383->6379/tcpada0a9c33698   redis-slave1   Up 17 minutes   0.0.0.0:6382->6379/tcp, :::6382->6379/tcp8deef53276d4   redis-master   Up 17 minutes   0.0.0.0:6381->6379/tcp, :::6381->6379/tcp

并且还可以通过 sentinel 查看集群的关系等信息。

bash
[root@centos ~]# docker exec -it sentinel1 redis-cli -h 192.168.11.10 -p 26381 info sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_tilt_since_seconds:-1sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=redis-master,status=ok,address=192.168.11.10:6381,slaves=2,sentinels=3

3. 故障转移测试

为了验证高可用性,现将充当 master 的容器 redis-master 停掉。

bash
[root@centos ~]# docker stop redis-masterredis-master

此时,再查看另外两个 redis 容器的状态数据,发现 redis-slave1 成为了 redis-slave2 的 slave,即 redis-slave2 成为了新的 master。

bash
[root@centos ~]# docker exec -it redis-slave1 redis-cli info replication# Replicationrole:slavemaster_host:192.168.11.10master_port:6383master_link_status:upmaster_last_io_seconds_ago:1......[root@centos ~]# docker exec -it redis-slave2 redis-cli info replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.11.10,port=6382,state=online,offset=173434,lag=1master_failover_state:no-failovermaster_replid:7c52a8fc9496262998e33e8cc572ba8065a4ab76master_replid2:18b96848c090146a55992566572b771e092c5207......

此时再次将 redis-master 容器启动(docker start redis-master)。并查看 redis-master 的状态数据,发现其成为了 redis-slave2 的 slave。

bash
[root@centos ~]# docker exec -it redis-master redis-cli info replication# Replicationrole:slavemaster_host:192.168.11.10master_port:6383master_link_status:upmaster_last_io_seconds_ago:1......[root@centos ~]# docker exec -it redis-slave2 redis-cli info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.11.10,port=6382,state=online,offset=243360,lag=0slave1:ip=192.168.11.10,port=6381,state=online,offset=243360,lag=0......

redis 分布式集群搭建

Redis 集群的每个节点中的保存的数据都是相同的。而 Redis 分布式系统的节点中存放的数据可以是不同的。当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点。

下面要搭建一个三主三从的 Redis 分布式系统。

序号 角色 容器名称 网络模式 暴露地址
1 master redis1 host 192.168.192.101:6381
2 master redis2 host 192.168.192.101:6382
3 master redis3 host 192.168.192.101:6383
4 slave redis4 host 192.168.192.101:6384
5 slave redis5 host 192.168.192.101:6385
6 slave redis6 host 192.168.192.101:6386

1. 准备工作

在/root 中 mkdir 一个名称为 cluster 的目录,并将前面的配置文件/root/redisSave/redis.conf 复制到这里。也就是 cluster 目录下要有一个 redis.conf 文件。接下来需要复制六份 redis.conf 文件。复制 redis.conf 为 redis1.conf,并在其中将下面两个配置前的注释符号去掉。这两项配置,一个是用于开启 cluster 功能,即分布式系统功能;一个是指定其需要的配置文件名称。

bash
cluster-enabled yescluster-config-file nodes-6379.conf

然后再以 redis1.conf 为模板复制出 5 份,分别为 redis2.conf、redis3.conf、redis4.conf、redis5.conf、redis6.conf。这 6 份配置文件内容完全相同。完成后 cluster 目录内容如下:

bash
[root@centos cluster]# ll总用量 648-rw-r--r--. 1 root root 106590 9月  17 20:58 redis1.conf-rw-r--r--. 1 root root 106590 9月  17 20:58 redis2.conf-rw-r--r--. 1 root root 106590 9月  17 20:58 redis3.conf-rw-r--r--. 1 root root 106590 9月  17 20:58 redis4.conf-rw-r--r--. 1 root root 106590 9月  17 20:58 redis5.conf-rw-r--r--. 1 root root 106590 9月  17 20:58 redis6.conf

2. 启动 redis

启动 6 个 Redis 容器。命令如下:

bash
# 启动redis1docker run --name redis1 --network host \-v /root/cluster/redis1.conf:/etc/redis/redis.conf \-v /root/cluster/data/6381:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6381# 启动redis2docker run --name redis2 --network host \-v /root/cluster/redis2.conf:/etc/redis/redis.conf \-v /root/cluster/data/6382:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6382# 启动redis3docker run --name redis3 --network host \-v /root/cluster/redis3.conf:/etc/redis/redis.conf \-v /root/cluster/data/6383:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6383# 启动redis4docker run --name redis4 --network host \-v /root/cluster/redis4.conf:/etc/redis/redis.conf \-v /root/cluster/data/6384:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6384# 启动redis5docker run --name redis5 --network host \-v /root/cluster/redis5.conf:/etc/redis/redis.conf \-v /root/cluster/data/6385:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6385# 启动redis6docker run --name redis6 --network host \-v /root/cluster/redis6.conf:/etc/redis/redis.conf \-v /root/cluster/data/6386:/data \-d redis:7.0 \redis-server /etc/redis/redis.conf --port 6386

启动完成后使用 docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" 命令查看状态等信息。如下所示:

bash
[root@centos ~]# docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"CONTAINER ID   NAMES     STATUS061b6c857cd1   redis6    Up 2 minutesccb59f6dccf6   redis5    Up 2 minutes56a62914b778   redis4    Up 3 minutes8688e4330c19   redis3    Up 3 minutes28caeea02970   redis2    Up 4 minutes680ca342b81d   redis1    Up 4 minutes

3. 创建系统

6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6 个节点创建为一个分布式系统。–cluster-replicas 1 指定每个 master 会带有一个 slave 副本。命令如下:

bash
docker exec -it redis1 redis-cli --cluster create --cluster-replicas 1 192.168.11.10:6381 192.168.11.10:6382 192.168.11.10:6383 192.168.11.10:6384 192.168.11.10:6385 192.168.11.10:6386

输入命令再回车后即可看到一个计划日志,输入 yes,就能把集群搭建完成。

4. 查看节点信息

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。

bash
[root@centos ~]# docker exec -it redis1 redis-cli -c -p 6381 cluster nodes97e1329e6fcdfc581600cbfbff9cb7443f2dc896 192.168.11.10:6381@16381 myself,master - 0 1694957249000 1 connected 0-5460b5413770795f75d7438bd72902ae2236ba537eb1 192.168.11.10:6382@16382 master - 0 1694957250000 2 connected 5461-10922d38ea5f6378f40fd576d951ddefee6b6985aa044 192.168.11.10:6385@16385 slave b5413770795f75d7438bd72902ae2236ba537eb1 0 1694957252000 2 connectedbae642466ac0a22b738a4c393ca90d6bc4782f29 192.168.11.10:6384@16384 slave 97e1329e6fcdfc581600cbfbff9cb7443f2dc896 0 1694957251494 1 connectedf961e1512c641f4d3031a476a3e0532c0bd8915c 192.168.11.10:6386@16386 slave b76066abc554d0edcdf48b284dc21da1c230c8e5 0 1694957250490 3 connectedb76066abc554d0edcdf48b284dc21da1c230c8e5 192.168.11.10:6383@16383 master - 0 1694957252502 3 connected 10923-16383

Comments

评论区将在滚动到这里时加载。