Fork me on GitHub

在Docker中安装Redis以及主从环境搭建

目录

单实例redis安装

下载redis镜像

1
docker pull redis

启动redis容器

1
docker run -d --name redis -p 6379:6379 redis

使用客户端RedisDesktopManager连接redis

官方下载地址 https://redisdesktop.com/download

我本地是win7系统,因此下载的是windows环境的软件安装包。

打开软件,数据相关IP以及端口号,连接redis服务,如下图:

在Docker中安装Redis以及主从环境搭建

由于我是在我的阿里云服务器上安装的redis,IP就是外网IP地址,端口号就是redis默认的端口号6379。

因为当前并未给redis设置密码验证,因此无需输入密码。

输入完成后,点击左下角的测试连接按钮。出现“success”字样的弹出框,就说明已经成功连接了远程服务器上的redis服务。

认真思考一下,上面的启动redis服务有什么缺点?

如果对于docker数据挂载有了解的朋友,或许很容器想到,上面启动redis服务的方式,存在“数据存储”的问题。

当然也有其他的相关待优化的问题,比如redis配置文件可以映射到宿主机上某目录下,方便维护管理,等等。

上面的默认情况下,redis中存储的数据,是由Docker容器管理的,我们可以通过命令查看一下数据存储的地方:

1
docker inspect e8

其中的“e8”指的是redis容器的ID

如下图所示(由于信息内容很多,我们只截取我们需要看的内容):

在Docker中安装Redis以及主从环境搭建

其中黄色圈起来的地方,就是redis数据存储的目录映射。“Source”指的是宿主机下的目录,“Destination”指的是容器中的目录。

虽然最终的数据依然是存储在宿主机上的,但是默认是由Docker容器管理的,如果我们想自己管理维护redis中的数据,就需要早启动redis容器的时候,在run命令中指定目录映射。

redis数据挂载

首先我们先停止上面启动的redis容器

在宿主机上创建redis相关的数据以及配置文件的存储目录

我们需要在宿主机上创建用于存储、管理redis相关数据以及配置文件的目录。

这里我就在 /opt 目录下新建一个 “docker_redis” 目录,然后在“docker_redis”目录下新建 “data”和“conf”这两个目录,最终结构如下:

在Docker中安装Redis以及主从环境搭建

复制一份redis.conf文件到宿主机的 /opt/docker_redis/conf/ 目录下

有些时候,在容器中找不到对应的文件在哪里,我们可以自己手动下载一个对应版本的redis的软件包,将里面的redis.conf复制一份到宿主机的目录中即可。

因为当前的redis容器中的redis版本是4.0.9(可以通过docker inspect 命令查看容器详细信息),因此我下载的软件包也是redis-4.0.9,尽量保持一致。

上传成功后,在对应目录下就有了一个redis.conf文件:

在Docker中安装Redis以及主从环境搭建

为了方便,这里我就上传一个redis.conf文件在附件里,如果有需要,可自行下载使用(redis版本是4.0.9)。

📎redis-conf.zip

修改redis.conf配置文件

既然我们将redis的配置文件映射到了宿主机上进行维护管理,我们就需要按照自己的需求,来进行相应的修改配置文件。

  • 让redis支持持久化:

将文件中的 “appendonly”的值配置成“yes”。(文件内容很多,自己慢慢寻找)

  • 开启redis访问密码:

将文件中的 “requirepass”的值配置成你自定义的密码即可。

  • 支持客户端访问容器中的redis服务

注意点:要想让其他客户端(非宿主机的应用)可以访问到容器中的redis服务,需要配置redis.conf中的“bind”参数,值为redis容器的IP。

查看正在运行中的redis的容器IP;如果没有正在运行的redis容器的话,你可以先启动一个redis容器:

1
2
3
4
docker run --name redis -p 6379:6379 \
-v /opt/docker_redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /opt/docker_redis/data:/data \
-d redis redis-server /usr/local/etc/redis/redis.conf

查看redis容器的ip,可以通过下面命令查看:

1
docker inspect 09|grep -i add

其中的“09”指的是redis容器的ID

回车运行,如下图所示:

在Docker中安装Redis以及主从环境搭建

可以明显看到,当前redis容器的IP地址是 172.18.0.3

因此,你可以将此IP地址配置到宿主机下面的 /opt/docker_redis/conf/redis.conf 文件中的bind参数。

修改完成bind参数之后,停止当前redis容器(docker stop命令)。

提醒:如果没有将redis.conf文件中的bind设置成redis容器的IP的话,客户端(比如 RedisDesktopManager)是无法连接redis服务的。

重启redis容器,实现配置文件映射以及数据挂载

这里是重启redis容器,因为上面我们已经运行了一个redis容器了。如果重新运行一个的话,显得有点浪费资源。

如果你忘记了之前停止的redis容器的ID的话,我们可以通过命令 docker ps -a 查看已经停止的容器以及正在运行中的容器列表。

在上面我们已经知道,redis容器ID的前两位字符是“09”,因此可以直接重启这个redis容器:

1
docker start 09

如果你的主机上没有正在运行的redis容器,也可以通过上面给出的命令运行一个新的容器:

1
2
3
4
docker run --name redis -p 6379:6379 \
-v /opt/docker_redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /opt/docker_redis/data:/data \
-d redis redis-server /usr/local/etc/redis/redis.conf

到此,就实现了redis的配置文件以及持久化数据挂载了宿主机上,方便后期的维护管理。

测试连接redis服务

  • 通过命令行测试连接redis服务
1
2
> docker exec -it 09 redis-cli -p 6379 -h 172.18.0.3
>

其中的“09”指的是redis容器的ID,“redis-cli”是redis的客户端连接工具。

回车即可连接到redis服务,同时我们也可以在里面验证一个密码是否有效,如下图所示:

在Docker中安装Redis以及主从环境搭建

可以看到,当执行“keys *”命令的时候,redis会提示你认证失败,原因是因为我们在redis.conf文件中设置了密码,所以,只有正确输入密码,才能执行命令并返回结果。

【注意项】:因为我们在redis.conf文件中配置了bind参数为容器的IP,所以我们在命令行连接redis的时候,需要指定 “-h 172.18.0.3” ,这样才能正常连接访问redis服务,不然无法连接的。

  • 通过客户端软件连接redis服务

在本地电脑上,通过RedisDesktopManager软件来测试连接,这一种连接还是很简单的。

在Docker中安装Redis以及主从环境搭建

其中的IP地址,指的是我的阿里云服务器的外网IP。

这次我们就需要输入密码才能访问redis服务。

redis主从环境安装

redis主从环境的搭建,有多种方式。平常最常用的方式就是,通过修改redis.conf文件,在文件中添加“slaveof”的参数配置。

对于以上的搭建方式,这里我就不多做讲解了,有兴趣的可以自行网上查阅资料学习。

虽然通过手动编辑redis.conf文件加入“slaveof”参数实现主从环境的搭建,但是大家有没有感受到,这种方式感觉很繁琐,不方便~如果从节点有很多呢,难道都要手动去修改吗?如果真是这样的话,就违背了docker的初衷。

鉴于上面的方式,既然是在docker上运行服务,那我们就要使用docker提供给我们的工具,来实现主从、甚至集群环境的多容器启动,强大的工具就是——docker compose。

因此,对于redis的主从环境搭建,我们就通过docker-compose这个docker编排工具来实现。

对于docker-compose不了解的,可以网上查阅资料学习一下,其实也不是很难理解,无非就是将我们平时使用的 run 命令通过在yml文件中描述出来,然后通过docker-compose命令运行这个文件来启动多个容器服务。

系统中需要安装docker-compose的软件包,这个我在之前的章节有讲解过,可以查看:

https://yuque.com/zhoubang/docker/docker-zookeeper-install#rl0bfu

创建 docker-compose 文件

在宿主机的 /opt/docker_redis/ 目录下新建 “redis_MS”目录,然后在 “redis_MS”目录下新建“docker-compose.yml”文件,然后在该文件中编写以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '2'
services:
redis-master:
image: redis
container_name: redis-master
ports:
- "7010:6379"

redis-slave:
image: redis
container_name: redis-slave
ports:
- "7011:6379"
command: redis-server --slaveof redis-master 6379
links:
- redis-master:redis-master

上面的配置,简单来说,其实就是启动了2个容器,容器名称分别是 redis-master、redis-slave。

以上配置中,每个容器都有image、ports、container_name(可选参数)这3个参数项,其实如果你了解 run 命令的话,很容器知道其中每个参数的含义。无非就是把 run 命令通过yml文件的形式编写出来罢了。做一下对比来消化理解,就比较容器了。

当然,docker compoer 还有很多高级的命令,有兴趣的可自行网上查阅资料学习。

启动 docker-compose

在 “docker-compose.yml”文件所在的目录下(/opt/docker_redis/redis_MS/)执行以下启动命令:

1
docker-compose up -d

运行效果如下图:

在Docker中安装Redis以及主从环境搭建

你会看到日志打印出了我们在yml文件中定义的2个容器名称。

查看容器是否启动成功

以下2种查看方式都是可以的。

  • 通过 docker ps 命令查看运行中的容器列表

在Docker中安装Redis以及主从环境搭建

  • 通过 docker-compose ps 命令查看运行中的

在Docker中安装Redis以及主从环境搭建

可以看到,其中的“State”列的值都是“Up”状态,说明容器处于正常运行。

验证redis主从是否有效

这里我们就直接使用客户端软件 RedisDesktopManager 来测试,比较直观一些。

首先还是打开此客户端软件,然后分别连接我们上面启动的2个redis服务,端口分别是7010和7011.

其中,7010这个端口对应的redis是一个master角色(主节点),而7011对应的redis是一个slave角色(从节点),因为,从上面的yml文件中就看的出来,7011的配置项中通过“links”来指向了7010的容器。

如下图所示:

在Docker中安装Redis以及主从环境搭建

在master节点下面新增一个数据(直接在软件上手动新增一条数据):

在Docker中安装Redis以及主从环境搭建

我们已经在master节点下面新增了一条测试数据,然后我们手动刷新一下下面的slave节点,看看db0下面是否会出现和master的db0下面相同的数据,刷新后如下图:

在Docker中安装Redis以及主从环境搭建

可以看到,数据已经自动同步到slave节点上了。redis主从可以说已经搭建好了。^_^

还有一个问题需要验证一下:既然是主从,说明master是可读写的,而slave只能是只读的,不能写操作。

  • 在“redis-slave-7011”这个从节点下面手动新增一个K-V数据,看看是否能成功写数据,最终效果如下:

在Docker中安装Redis以及主从环境搭建

通过上图可以看到,控制台信息打印出“You can’t write against a read only slave.”,意思也就是,你不能在只读模式的节点下面进行写操作。这也就验证了我们的从节点是只读的。

同时,slave、master节点下面,也没有任何的数据变化。

  • 删除“redis-slave-7011”节点下面的test测试数据,看看是否能删除成功,经过试验,最终结果依然是:

You can’t write against a read only slave.

这与上面出现的提示一样,说明slave节点是只读的。

  • 删除“redis-master-7010”节点下面的test测试数据,看看从节点(redis-slave-7011)下面是否同步删除,经过试验,最终结果是:

“redis-slave-7011”这个 从节点 下面的相同数据也同步被删除掉了。

通过上面的3个验证方式,印证了我们上面说的,master是可读写的,slave是只读的,不可写。

相关文章