使用docker可以简单的启动一个Redis,只需要从docker仓库中拉取到redis的镜像,然后直接运行即可,依次执行如下脚本。
# 从docker仓库中拉取redis最新的镜像
docker pull redis
# 运行一个redis容器
docker run --name redis -p 6380:6379 -d redis
# 运行redis容器,并指定密码
docker run --name redis -p 6380:6379 -d redis --requirepass "123456"
简单的解释一下上面参数的意思:
--name
:指定容器的名字,这个名字是唯一的。
-p
:做端口映射,6380:6379
,前一个端口是指的安装docker的宿主机的端口,后一个端口指的是docker容器的端口。如果在同一个宿主机上,要启动多个redis容器实例的话,就需要修改前一个端口号。
-d
:表示在后台启动容器
--requirepass
:redis的配置参数,这里指的是redis访问密码。
注:如果需要在docker启动时自动启动容器,再运行一个docker的命令即可
docker update redis --restart=always
启动好了之后,就可以通过redis的客户端进行操作了,使用exec
命令可以打开docker容器。
# 打开redis客户端;redis表示的是容器名称;redis-cli是容器里面的小型linux系统指令,用来打开redis客户端
docker exec -it redis redis-cli
-i
:表示交互式的运行
-t
:表示分配可以输入指令的终端。
两者一般是一同使用的。
由于设置里密码,这里需要先验证密码。
验证完成之后,就能够使用了,尝试set几个数据。
redis的持久化策略有RDB和AOF两种,默认使用的是RDB快照的形式,对于docker运行redis容器来说,我们不妨猜测一下,如果重启了redis容器,之前保存的数据是否还存在?
下面就重启一下redis容器。
docker restart redis
再次进入终端参看之前set的key还在不在,发现还是存在。
这是因为redis容器中保存了RDB快照文件,就在容器的data目录下,使用下面的脚本打开容器就可以看到。
docker exec -it redis bash
执行到这里,又有新的问题出现了。
要解决这些问题,就需要使用redis的配置文件redis.conf
进行自定义的配置,然后docker通过自定义的redis.conf
来进行启动。
redis的每个版本都有一个默认的redis.conf
配置文件,这个配置文件可以在官网去下载,也可以下载对应版本的tar包,从tar包中获取。
附:Redis tar包下载地址
在下载之前,先查看docker容器中的redis版本,打开redis-cli,通过info指令可以获取到版本号。
我这里是6.2.5,所以我对应下载的就是6.2.5的tar包。
注:redis.conf的版本需要和redis容器的版本一致,否则可能会启动失败。
现在有了redis.conf
文件,要完成将rdb和aof文件保存到宿主机中,还需要两个步骤:
redis.conf
文件,一个用于存放持久化文件,并修改redis.conf
配置持久化策略。先准备两个文件路径以备用,后面的映射需要用到:
然后将下载好的redis.conf
文件扔到配置文件路径中,做持久化策略,只需要修改两处位置,其他的可以使用默认配置。
RDB配置:
通过vim
编辑配置文件,输入/SNAP
回车,找到快照配置。
根据上面的英文注释可知,save 3600 1
,表示在一个小时内至少有1个key发生变化,就会保存快照,下面两个同理。也可以根据这个语法,自定义快照保存的规则。
同时需要配置持久化文件的保存路径,在SNAPSHOTING的最后一行。
注:这里修改为/data,是因为redis容器中存放快照文件的路径就是/data,方便后面做映射,当然也可以修改为其他的可用路径。
AOF配置:
使用/appendonly
,回车找到AOF配置的位置,打开AOF策略。
配置完成之后,:wq
保存并退出。
注:如果需要远程访问redis,还需要将配置文件中绑定127.0.0.1注释掉。
输入/bind 127.0.0.1
启动脚本如下:
docker run --name redis01 -p 6340:6379 \
-v /usr/local/ls/data/redis:/data \
-v /usr/local/ls/config/redis/redis.conf:/etc/redis/redis.conf --privileged=true -d redis \
redis-server /etc/redis/redis.conf
--privileged=true
:表示给容器root权限,否则无法使用appenonly。
-v
:docker的Volume指令,将数据同步到映射中的宿主机的路径中去,路径以:
隔开,左侧为宿主机路径,右侧为容器路径。
redis-server
:表示使用右侧路径中的配置文件启动。
容器启动时会将宿主机路径/usr/local/ls/config/redis/redis.conf
同步到容器的/etc/redis/redis.conf/
中,然后容器通过这个etc路径下的配置文件进行启动。
同时在2.2.中配置的dir /data
也会在redis运行过程中,将持久化文件同步到宿主机中去。
现在可以测试一下持久化策略有没有生效,打开redis客户端,随便输入几个key:
然后打开上面映射好的宿主机路径/usr/local/ls/data/redis
查看,可以看到aof日志已经保存下来了。
再尝试重启redis容器,测试数据是否完整,依次执行下面的脚本
docker restrat redis01
docker exec -it redis01 redis-cli
keys *
RDB文件去哪里了?
因为配置的策略是一小时内有1条会生成,现在录入了3条数据,但是时间还没到,就还没有生成。
除此之外,还有手动去生成RDB文件,下面几个指令都可以。
save
:生成一个快照bgsave
:后台fork一个进程生成快照。shutdown
:会先调用save方法。docker对容器的停止、重启也会触发快照的生成。