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
d53625076ecd9736b156bfbd79dabc3e925e2e9286fe2fed05d7b9e58f1797c1

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服务设置一个密码,也就是自定义配置文件redis.conf

自定义配置文件启动

同样先停掉上面的容器。

创建一个目录,我们会在这个目录里面存放用于构建image的Dockerfile,以及配置文件redis.conf

[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:40 redis.conf
[root@testmachine csdn]#

修改配置文件,设置一个密码

[root@testmachine csdn]# cat redis.conf | 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 ./redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

创建镜像

[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 ./redis.conf /usr/local/etc/redis/redis.conf
 ---> 797cc462e1ab
Step 3/3 : CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
 ---> 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:40 redis.conf
[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 jhao104/proxy_pool
1f04b1bf46e1c944db65921b0fac7ae81fe67d6bece52247188478466cca1571
[root@testmachine data]#

这里采用的是github上一个采集爬虫代理ip的项目,主要是演示使用,利用redis容器的ip和端口还有密码可以成功连接到redis容器

总结

能够启动容器供外界连接,并保证容器的安全性,就完成了大部分的功能。关于redis容器的实际使用,我们以后的文章再一起学习吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值