上一篇:php面试问题汇总(2020-04-18 19:49:00)
文章大纲

docker安装及redis主从结构的部署

2020-04-18 22:51:23

一、安装docker

1.如果已经安装了docker,先卸载:

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine


2.接着安装yum-utils包

yum install -y yum-utils

因为后面用到的yum-config-manager命令在yum-utils包里。


3.设置仓库

yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo


4.安装docker

安装docker分安装最新版本的和安装指定方式的这两种方式。

>>最新的

yum install docker-ce docker-ce-cli containerd.io


>>指定版本

先查出有哪些版本:

yum list docker-ce --showduplicates | sort -r

结果如下所示:

Installed Packages
docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-test
docker-ce.x86_64 3:19.03.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-test
docker-ce.x86_64 3:19.03.7-3.el7 docker-ce-stable

其中19.03.8-3.el7就是版本号,注意不要将3:这部分带进去了。


开始用指定版本的命令安装:

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io


装完,用docker --version命令检查,有版本号,就代表安装成功。

>>docker --version
Docker version 19.03.8, build afacb8b


最后启动docker服务:

systemctl start docker


加入开机自动启动docker服务:

systemctl enable docker


二、安装redis


先查看docker里镜像有哪些:

docker image ls


这里我一年前在docker里装过一些镜像:

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
webdevops/php-nginx latest 900246fb5692 11 months ago 571MB
redis latest a55fbf438dfd 12 months ago 95MB
hello-world latest fce289e99eb9 15 months ago 1.84kB


现在我为了再次练习docker操作,打算重装一下redis。


先删除redis镜像:

docker image rm redis

结果报错:

Error response from daemon: 
conflict: unable to remove repository reference "redis" (must force)
- container 552281f854ca is using its referenced image a55fbf438dfd

意思是有容器实例正在使用这个镜像。


接着又是查看容器,并删除redis相关容器。


查看容器:

docker container ls -a

结果如下:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
552281f854ca redis "docker-entrypoint.s…" 11 months ago Exited (0) 34 hours ago redis-slave-a
748e6eee4231 redis "docker-entrypoint.s…" 11 months ago Exited (0) 34 hours ago redis-master
4147821caa2c hello-world "/hello" 11 months ago Exited (0) 11 months ago sad_cerf


根据container id,删除对应container容器:

docker container rm 552281f854ca


删除了redis相关容器,并删除redis镜像后,再重新拉取redis镜像。

docker image pull redis


如果容器实例已经启动了,需要先将容器终止,Exited就是终止的状态。

docker container stop Container-ID


三、创建redis实例

手动执行如下命令即可:

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

docker run命令,表示通过镜像创建容器实例,并启动实例。

如果是用docker create命令,就代表的是创建容器实例,之后还需要用“docker container start  容器ID”命令去启动实例。


created状态的容器,要用"docker rm -f 容器ID"命令才能删除该容器。


这里6379:6379表示左边是redis实例里的端口,映射到服务器里的6379端口。


如果此时服务器已经安装并启动了redis,上面命令就会报错,提示端口占用,错误提示大概如下所示:

listen tcp 0.0.0.0:6379: bind: address already in use


解决方法:

先将服务器redis服务关掉后,再执行上面创建redis-6379实例的命令即可。

关掉服务器redis服务:

>>which redis-cli
/usr/local/bin/redis-cli

>>/usr/local/bin/redis-cli shutdown


虽然上面解决方法奏效了,但是翟码农还是没太理解,redis-cli shutdown后,本人在docker里创建好redis-6379实例后,服务器里执行redis-cli,能够成功连接。


关于redis进程的变化过程,本人暂记录在下面:

>>ps -ef |grep redis
root 6951 1 0 2018 ? 13:57:56 /usr/local/bin/redis-server 127.0.0.1:6379
polkitd 22898 22882 0 22:59 ? 00:00:00 redis-server *:6379
polkitd 23066 23050 0 22:59 ? 00:00:00 redis-server *:6379
root 23458 21853 0 23:04 pts/6 00:00:00 grep --color=auto redis


>>/usr/local/bin/redis-cli shutdown
>>ps -ef |grep redis
polkitd 22898 22882 0 22:59 ? 00:00:00 redis-server *:6379
polkitd 23066 23050 0 22:59 ? 00:00:00 redis-server *:6379
root 23469 21853 0 23:06 pts/6 00:00:00 grep --color=auto redis


创建了redis-6379实例后,再执行下面命令,创建另外两个实例:

docker run --name redis-6380 -p 6380:6379 -d redis
docker run --name redis-6381 -p 6381:6379 -d redis


用docker ps命令就可以查看运行中的所有容器实例:

>>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f66d49b2b699 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp redis-6379
d99da39cfda9 redis "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 0.0.0.0:6381->6379/tcp redis-6381
63b0eb89c9ae redis "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 0.0.0.0:6380->6379/tcp redis-6380


四、搭建redis主从结构

先要掌握如何在实例里启动redis客户端的命令:

docker exec -it 容器ID redis-cli


关于容器ID,上面docker ps和docker container ls -a这两个命令都可以查询到。


进入上面3个实例的redis客户端里,查出都是master结点,无从结点。

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
...


接下来我们要做的,就是先挑出主节点,找出主节点对应的ip,然后进入另外两个结点,建立主从联系。


本文翟码农挑出redis-6379实例作为主节点。此处之后的文章内容里的字符串,都是上面docker ps查询出来的容器ID,大家实践时,具体根据实践情况自行修改。


先找出主结点的ip:

>> docker inspect f66d49b2b699
...
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
...


然后进入另外两个redis容器实例,使用slaveof命令与主节点redis-6379关联起来。

>>docker exec -it d99da39cfda9 redis-cli
127.0.0.1:6379> slaveof 172.17.0.4 6379
OK

>>docker exec -it 63b0eb89c9ae redis-cli
127.0.0.1:6379> slaveof 172.17.0.4 6379
OK


关联完成后,再进入主节点,检查一下从结点数目:

>>docker exec -it f66d49b2b699 redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.2,port=6379,state=online,offset=972577,lag=0
slave1:ip=172.17.0.3,port=6379,state=online,offset=972577,lag=1
...

可以看出,从节点数目变成2了,可见主从结构已经部署成功了。


redis主从结构自带主从复制的功能,即在主节点里创建一个新的redis key并赋值,进入从结点可以也可以查看到这个新key的值。这个就大家自行去检验了。


另:

本文时间过程中,在服务器里redis服务的6379端口影响到docker里redis-6379容器的创建时,本人思考,服务器里redis服务和docker里redis实例难不成是共用的一个redis服务?


经过实践证明,两者并无联系。就是在服务器里创建了一个redis key,在docker里的redis实例里是不存在这个key的。这结果也跟docker这一工具的原理是相符的,每个容器有着独自一套的运行环境和应用程序,互不干扰。


只是在docker容器实例进行端口映射时,必须要求服务器里该端口不被占用。容器创建好后,服务器里该端口仍是可以正常使用的。


本文为翟码农个人博客里php分类下的有关redis的技术原创文章,转载请注明出处:http://www.zhai14.com/blog/install-docker-and-establish-the-structure-of-redis-master-slave.html


上一篇:php面试问题汇总(2020-04-18 19:49:00)
我要评论
评论列表