前言:
本文讲解如果用dockerfile创建redis4.0.10镜像并挂载容器数据、配置文件目录!
一、下载redis4.0.10的源码安装包
[root@dingzhi ~]# cd redis4.0.10/
[root@dingzhi redis4.0.10]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
#文件大小才2M左右
二、在/root/redis4.0.10里创建dockerfile
[root@dingzhi redis4.0.10]# vim dockerfile
FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="redis-4.0.10"
#wget http://download.redis.io/releases/redis-4.0.10.tar.gz
ADD $WJ.tar.gz /usr/local/
RUN yum -y install gcc gcc-c++ make \
&& mkdir -p /usr/local/$WJ/etc \
&& mkdir /usr/local/$WJ/data \
&& cd /usr/local/$WJ \
&& make MALLOC=libc \
&& mv /usr/local/$WJ/redis.conf /usr/local/$WJ/etc \
&& sed -i -e 's@protected-mode yes@protected-mode no@g' /usr/local/$WJ/etc/redis.conf \
&& echo "requirepass kU08#y" >> /usr/local/$WJ/etc/redis.conf \
&& sed -i 's/dir \.\//dir \/usr\/local\/redis-4.0.10\/data/' /usr/local/$WJ/etc/redis.conf \
&& echo "${TIME_ZOME}" > /etc/timezone \
&& ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
&& yum clean all \
&& yum -y remove gcc gcc-c++ make
WORKDIR /usr/local/$WJ/src
EXPOSE 6379
#启动
ENTRYPOINT /usr/local/redis-4.0.10/src/redis-server /usr/local/redis-4.0.10/etc/redis.conf
说明:
1、关闭redis保护模式sed -i -e 's@protected-mode yes@protected-mode no@g' /usr/local/$WJ/etc/redis.conf 。因为默认redis需要设置管理员账号密码,开启了保护模式,所以如果第一次使用没有设置管理员,就会出现报错,关闭保护模式即可。
2、这一步sed -i 's/dir \.\//dir \/usr\/local\/redis-4.0.10\/data/' /usr/local/$WJ/etc/redis.conf ,是修改redis存储数据的存放位置,修改后的路径为/usr/local/redis-4.0.10/data/的目录下。不修改的话,就存放在/usr/local/redis-4.0.10/下,与其它配置、启动的文件同一级目录,不分隔实现寄主主机挂载数据目录的话,不方便管理。
三、创建redis4.0.10镜像
[root@dingzhi redis4.0.10]# docker build -t redis4.0.10:latest ./
四、实现本地数据持久化挂载
4.1、查看创建好的redis4.0.10镜像
[root@dingzhi ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis4.0.10 latest bbcb83519ab6 3 hours ago 314 MB
tomcat8.5.40 latest f06aacf399c4 8 hours ago 622 MB
jdk8.0.211 latest c598103b2c55 2 days ago 608 MB
nginx1.15.7 latest 4b05c87dcbec 2 days ago 302 MB
php7.2.16 latest 3428fd528787 2 days ago 627 MB
docker.io/mysql 5.7 98455b9624a9 3 weeks ago 372 MB
docker.io/centos latest 9f38484d220f 5 weeks ago 202 MB
4.2、启动镜像并映射容器端口与挂载容器数据目录
[root@dingzhi ~]# docker run --restart=always -p 6379:6379 -v /data/redis/data/:/usr/local/redis-4.0.10/data --name redis -d bbcb
e7da69d3a62f17331a09bf94f8b6ae176a991f00aeacab2869e4774c4f39f408
[root@dingzhi ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7da69d3a62f bbcb "/bin/sh -c '/usr/..." 4 seconds ago Up 3 seconds 0.0.0.0:6379->6379/tcp redis
(实现/data/redis/data/目录的数据/usr/local/redis-4.0.10/data/的数据同步)
4.3、实现容器的data和etc目录文件挂载
同时想要把容器里的/usr/local/redis-4.0.10/etc/redis.conf复制到/usr/local/redis-4.0.10/data/里,关闭容器,在寄主主机/data/redis/data/里就有redis.conf,创建目录mkdir /data/redis/etc/后移动mv /data/redis/data/redis.conf /data/redis/etc/
[root@dingzhi ~]# docker exec -it redis /bin/bash #进入redis容器里
[root@e7da69d3a62f redis-4.0.10]# pwd
/usr/local/redis-4.0.10
[root@e7da69d3a62f redis-4.0.10]# ls
00-RELEASENOTES CONTRIBUTING INSTALL Makefile data etc runtest-cluster sentinel.conf tests
BUGS COPYING MANIFESTO README.md deps runtest runtest-sentinel src utils
[root@e7da69d3a62f redis-4.0.10]# cp etc/redis.conf data/ #复制redis.conf到实现寄主主机本地挂载
先停止并删除容器
[root@dingzhi ~]# docker kill $(docker ps -q) #停止运行中的容器
e7da69d3a62f
[root@dingzhi ~]# docker rm -f $(docker ps -qa) #删除停止运行的容器
e7da69d3a62f
寄主主机本地目录设置好后,再次启动容器,多添加了容器的/usr/local/redis-4.0.10/etc/目录挂载
[root@dingzhi data]# cd /data/redis
[root@dingzhi redis]# ls
data etc
[root@dingzhi redis]# ls etc/
[root@dingzhi redis]# mv data/redis.conf etc/
[root@dingzhi redis]# ls etc/
redis.conf
[root@dingzhi ~]# docker run --restart=always -p 6379:6379 -v /data/redis/data/:/usr/local/redis-4.0.10/data -v /data/redis/etc/:/usr/local/redis-4.0.10/etc --name redis -d bbcb
bd9e26d3795f97196620c32203921056cbd5acdec112df40bf8279e697ddf82
五、测试验证
5.1、登录容器
[root@dingzhi ~]# docker exec -it bd9e /bin/bash
5.2、容器内登录redis客户端,并创建数据
[root@bd9e26d3795f src]# ./redis-cli -h 127.0.0.1 -p 6379 -a kU08#y
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name lituxiu
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"lituxiu"
127.0.0.1:6379> exit
[root@bd9e26d3795f src]# ls /usr/local/redis-4.0.10/data/
[root@bd9e26d3795f src]#
# redis一开始数据创建了也不会那么快生成,不必惊慌,这和redis的存储机制有关。
5.3、在宿主主机重起redis容器,数据就生成了
[root@dingzhi data]# pwd
/data/redis/data
[root@dingzhi data]# ls
[root@dingzhi data]# docker restart bd9e
bd9e
[root@dingzhi data]# ls
dump.rdb
[root@dingzhi data]#