Redis从⼊门到精通(4):docker运⾏redis容器详解
随着微服务的引⼊,越来越多的服务运⾏在容器中,redis也不例外。这⼀篇我们就来看看如何运⾏⼀个redis容器,以及实现数据持久化,导⼊个性化配置等等内容。
我是T型⼈⼩付,⼀位坚持终⾝学习的互联⽹从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。⽂章⽬录
准备条件
这⾥需要⼀台已经装好了docker的机器,例如我这台centos7机器安装的就是docker 18.09版本
[root@testmachine csdn]# docker -v
Docker version 18.09.3, build 774a1f4
同时需要先从dockerhub下载redis官⽅镜像到本地,我因为本地已经提前下载了,所以会显⽰如下
[root@testmachine csdn]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
Digest: sha256:7b84b346c01e5a8d204a5bb30d4521bcc3a8535bbf90c660b8595fad248eae82
Status: Image is up to date for redis:latest
需要科学上⽹才能访问dockerhub,请提前搭好梯⼦再做上述操作
然后就可以正式开始我们的操作了
原始镜像直接启动
下载的redis镜像可以直接启动,这时候就跟新安装redis采⽤默认配置启动⼀样,没有连接密码,默认端⼝6379。请确保6379端⼝没有被占⽤。
[root@testmachine csdn]# docker run -p 6379:6379 -d redis
e1ec6161f97faa0eb8e969634b31fa6f38c2dfb7a35714689fa619a325630939
[root@testmachine csdn]#
-p是把宿主机的6379端⼝映射到了容器的6379端⼝,格式为-p host:container
启动以后就可以直接⽤客户端进⾏连接了
oot@testmachine bin]# ./redis-cli
127.0.0.1:6379>
但是这样⼦执⾏直接把⼀个没有密码的redis服务暴露给了外⽹。
最好是限制⼀下,只能被宿主机本地的客户端访问。
限制容器只能本地访问
停掉刚才的容器,并删除
[root@testmachine csdn]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1ec6161f97f redis "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:6379->6379/tcp awesome_rosalind
[root@testmachine csdn]# docker container kill e1
e1
[root@testmachine csdn]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
e1ec6161f97faa0eb8e969634b31fa6f38c2dfb7a35714689fa619a325630939
e9c9cbd3d30e119b33154cb4c65d282651d88a74c0db9925a46dfbd925605783
74c35336fc0ffb07a6d94729d818eab0ba7788fbca6937b8f9ce63a637c4906c
06497acdabcae3914466fe62c672eda194431ca548fd0acb8e3654d96721e78b
d5*******ecd9736b156bfbd79dabc3e925e2e9286fe2fed05d7b9e58f1797c1
Total reclaimed space: 550.9kB
[root@testmachine csdn]#
重启启动容器,这⼀次-p的内容不太⼀样
[root@testmachine csdn]# docker run -p 127.0.0.1:6379:6379 -d redis
b2ea2010a78a5dfa3f89b2be989c0ce3434e165704f7f6dbe9d7b8b1b8efe5b3
[root@testmachine csdn]#
这样⼦就只有127.0.0.1在监听6379端⼝了
[root@testmachine csdn]# netstat -ntlp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5741/docker-proxy
[root@testmachine csdn]#
同样也可以直接⽤本地的客户端去连接。
但是这样⼦还不够,需要给redis服务设置⼀个密码,也就是⾃定义配置⽂件f。
⾃定义配置⽂件启动
同样先停掉上⾯的容器。
创建⼀个⽬录,我们会在这个⽬录⾥⾯存放⽤于构建image的Dockerfile,以及配置⽂件f
[root@testmachine csdn]# ll
total 68
-rw-r--r-- 1 root root 120 Feb 7 11:33 Dockerfile
-rw-rw-rw- 1 fuhx fuhx 61794 Feb 7 11:f
[root@testmachine csdn]#
修改配置⽂件,设置⼀个密码
[root@testmachine csdn]# f | grep ^requirepass
requirepass xiaofu
[root@testmachine csdn]#
需要注意,配置⽂件⾥⾯的daemonize选项⼀定要选择no,不然启动容器会报错。因为docker已经是后台运⾏,再设置后台就会冲突。同时要将bind 设置为0.0.0.0⽽不是默认的127.0.0.1,不然会有Error: Connection reset by peer的报错
然后创建Dockerfile如下,将本地的配置⽂件拷贝到镜像,并在启动容器的时候按照⾃定义配置⽂件来启动
FROM redis
COPY ./f /usr/local/etc/f
CMD [ "redis-server", "/usr/local/etc/f" ]
创建镜像
[root@testmachine csdn]# docker build -t redis:v2 .
Sending build context to Docker daemon 64.51kB
Step 1/3 : FROM redis
---> 44d36d2c2374
Step 2/3 : COPY ./f /usr/local/etc/f
---> 797cc462e1ab
Step 3/3 : CMD [ "redis-server", "/usr/local/etc/f" ]
---> Running in 9341f989b5f3
Removing intermediate container 9341f989b5f3
---> ad325497c623
Successfully built ad325497c623
Successfully tagged redis:v2
[root@testmachine csdn]#
新的镜像名字为redis:v2,按照当前⽬录的Dockerfile构建起来
[root@testmachine csdn]# docker image ls | grep redis
redis v2 ad325497c623 About a minute ago 98.3MB
redis latest 44d36d2c2374 5 days ago 98.2MB
[root@testmachine csdn]#
然后再按照新的镜像启动容器
ot@testmachine csdn]# docker run -p 127.0.0.1:6379:6379 -d redis:v2
39eb904dad3c9351d6885bb0ef42168218ec7f93c098b0c4602f57dbe067b6e9
[root@testmachine csdn]#
这时候再去连接就需要密码了
ot@testmachine bin]# ./redis-cli -a xiaofu
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
这样⼦基本就达到⽬的了,但是假如容器⾥的持久化数据如果没有保存到宿主机上,那⼀旦容器销毁redis数据库也就没了。还需要将redis 容器⾥⾯的持久化数据同步到宿主机,也就是数据卷积。
数据卷积保存持久化数据
数据卷积volume可以实时将容器的⼀个⽬录和宿主机的⼀个⽬录同步,我这⾥将宿主机的/home/fuhx/csdn/data⽬录对应到容器的/data⽬录
[root@testmachine csdn]# mkdir data
[root@testmachine csdn]# ll
total 68
drwxr-xr-x 2 root root 6 Feb 7 20:10 data
-rw-r--r-- 1 root root 120 Feb 7 11:33 Dockerfile
-rw-rw-rw- 1 fuhx fuhx 61794 Feb 7 11:f
[root@testmachine csdn]#
启动容器,注意-v部分的设置
[root@testmachine csdn]# docker run -p 127.0.0.1:6379:6379 -v /home/fuhx/csdn/data:/data -d redis:v2
c04a1d5d69d08670f965c058c7e7c3b7e201022c80f5da826b828985f616eb4b
[root@testmachine csdn]#
客户端连到redis,写⼊⼀点数据并持久化
[root@testmachine bin]# ./redis-cli -a xiaofu
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name xiaofu
OK
127.0.0.1:6379> set sex male
OK
127.0.0.1:6379> keys *
1) "sex"
2) "name"
127.0.0.1:6379> save
OK
127.0.0.1:6379>
这时候发现宿主机上也有了持久化数据
[root@testmachine csdn]# cd data
[root@testmachine data]# ll
total 4
-rw-r--r-- 1 polkitd ssh_keys 120 Feb 7 20:13 dump.rdb
[root@testmachine data]#
以后再启动redis容器的时候只要依然采⽤这个卷积数据就不会丢失。
容器连接测试
最后,我们尝试⽤本地的另⼀个容器去连接redis容器。
默认情况下容器都会以bridge模式连接到宿主机的docker0⽹卡,并获得该⽹段的⼀个ip
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:4fff:fe0f:fd42 prefixlen 64 scopeid 0x20<link>
ether 02:42:4f:0f:fd:42 txqueuelen 0 (Ethernet)
RX packets 687 bytes 81516 (79.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 407 bytes 27828 (27.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查询redis容器的信息
[root@testmachine data]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c04a1d5d69d0 redis:v2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 127.0.0.1:6379->6379/tcp jolly_elbakyan [root@testmachine data]# docker inspect c0
截取信息如下
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "c123733d7301c39c993981c2064a0868e3cc5e5e92c08ef019a69a8062268b7e",
"EndpointID": "c7df3e61360b031dc2b703a5fad3e3ee57c1917af81350cd4b25ca795e3ed185",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
可以看到redis容器的ip为172.17.0.2。那么就可以在别的容器⽤这个ip去访问redis服务了
[root@testmachine data]# docker run --env db_type=REDIS --env db_host=172.17.0.2 --env db_port=6379 --env db_password=xiaofu -p 5010:5010 -d jha o104/proxy_pool
1f04b1bf46e1c944db65921b0fac7ae81fe67d6bece52247188478466cca1571
[root@testmachine data]#
这⾥采⽤的是github上⼀个采集爬⾍代理ip的项⽬,主要是演⽰使⽤,利⽤redis容器的ip和端⼝还有密码可以成功连接到redis容器
总结
能够启动容器供外界连接,并保证容器的安全性,就完成了⼤部分的功能。关于redis容器的实际使⽤,我们以后的⽂章再⼀起学习吧。
>docker重启容器命令
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论