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
先查看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
手动执行如下命令即可:
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客户端的命令:
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