Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/
虚拟化技术特点:1.资源占用多 2.冗余步骤多 3.启动很慢
容器化技术:容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机的不同:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #国外的地址
# 设置阿里云的Docker镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国外的地址
yum makecache fast
#docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
# 查看当前版本号,是否启动成功
docker version
# 设置开机自启动
systemctl enable docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问!Docker Server接收到Docker-Client的指令,就会执行这个指令!
Docker为什么比VM Ware快?
1、Docker比虚拟机更少的抽象层
2、docker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。Docker和VM的对比如下:
#命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
1.docker images 查看本地主机的所有镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
2.docker search 搜索镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3819 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 754 [OK]
percona Percona Server is a fork of the MySQL relati… 517 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 86
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 79
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK]
3.docker pull 镜像名[:tag] 下载镜像
#[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
4.docker rmi 删除镜像
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
拉取运行镜像
#取centos镜像
docker pull centos
#运行容器的命令说明:
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
(
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P 随机指定端口(大写的P)
进入/退出容器
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker run -it centos /bin/bash
[root@bd1b8900c547 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q 不停止容器退出
[root@bd1b8900c547 /]# exit
exit
[root@iZwz99sm8v95sckz8bd2c4Z ~]#
列出运行过的容器命令
#docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bca129320bb5 centos "/bin/bash" 4 minutes ago Exited (0) 3 minutes ago optimistic_shtern
bd1b8900c547 centos "/bin/bash" 6 minutes ago Exited (0) 5 minutes ago cool_tesla
cf6adbf1b506 bf756fb1ae65 "/hello" 5 hours ago Exited (0) 5 hours ago optimistic_darwin
删除容器命令:
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器命令
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
查看容器中进程信息
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker top c703b5b1911f
UID PID PPID C STIME TTY TIME CMD
root 11156 11135 0 11:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root 11886 11156 0 11:43 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
查看容器的元数据
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker inspect 容器id
进入正在运行的容器
方式一:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker exec -it c703b5b1911f /bin/bash
[root@c703b5b1911f /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@c703b5b1911f /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:31 ? 00:00:00 /bin/sh -c while true;do echo hi;sleep 5;done
root 279 0 0 03:54 pts/0 00:00:00 /bin/bash
root 315 1 0 03:56 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 5
root 316 279 0 03:56 pts/0 00:00:00 ps -ef
方式二:
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker attach c703b5b1911f
docker exec 进入容器后开启一个新的终端,可以在里面操作
docker attach 进入容器正在执行的终端,不会启动新的进程
拷贝操作
#拷贝容器的文件到主机中
docker cp 容器id:容器内路径 目的主机路径
#拷贝宿主机的文件到容器中
docker cp 目的主机路径 容器id:容器内路径
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。
Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统是UnionFS联合文件系统。
特点
Docker镜像都是可读的,当容器启动时,一个新的可写层被加载到镜像顶部!
这一层就是我们通常说的容器层,容器层之下都是镜像层!
使用docker commit 命令提交容器成为一个新的版本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
容器数据卷就是容器之间的数据共享技术,即卷技术。可以将容器内的目录挂载到宿主机上。
容器中的配置和数据通过数据卷挂载到宿主机上,保证数据不会随容器销毁儿丢失
方式一:
#docker run -it -v 主机内目录:容器目录
[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
#创建一个dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "--------end-------"
CMD /bin/bash
#通过dockerfile构建镜像
[root@localhost docker-test-volume]# docker build -f dockerfile01 -t jzqcentos:0.1 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 067ba2304e74
Removing intermediate container 067ba2304e74
---> aef623cdfe83
Step 3/4 : CMD echo "--------end-------"
---> Running in 1c5c8b3876b8
Removing intermediate container 1c5c8b3876b8
---> 16e27549fc39
Step 4/4 : CMD /bin/bash
---> Running in ce74dfbf90f1
Removing intermediate container ce74dfbf90f1
---> f6eb7fd632d9
Successfully built f6eb7fd632d9
Successfully tagged jzqcentos:0.1
#启动容器
[root@localhost docker-test-volume]# docker run -it jzqcentos:0.1 /bin/bash
mysql数据持久化问题
#获取镜像
[root@localhost ~]# docker pull mysql:5.7
#运行容器,挂载数据,启动时配置mysql用户密码
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名
[root@localhost ~]# docker run -it -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
匿名挂载
通过-v参数指定容器内路径,不指定容器外具体挂载路径
#匿名挂载
-v 容器内路径
[root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的volume情况
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 8220a55ff7545e64e1f5fe20838be652592382777ded8949ee33f85aef4b80ec
[root@localhost ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
3983cd57c1d5ce85ff77e8cfa7d8aa2c2f49ba0db6ec8b42bf1505d3cc6af29a
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 8220a55ff7545e64e1f5fe20838be652592382777ded8949ee33f85aef4b80ec
local juming-nginx
所有docker容器内的卷,没有指定目录的情况下都存放在 /var/lib/docker/vlumes/xxx/-data中
通过具名挂载可以方便的找到对应的卷,大多数情况都使用具名挂载
#具名挂载、匿名挂载和指定路径挂载的区别
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展:
#通过 -v 容器内路径:ro/rw 改变读写权限
#ro 只读
#rw 可读可写
#默认是rw,如果设置了ro权限,容器就不能修改文件的内容了,只能通过外部宿主机修改
[root@localhost ~]# docker -d -P --name nginx03 -v juming-nginx:ro nginx
[root@localhost ~]# docker -d -P --name nginx03 -v juming-nginx:rw nginx
dockerfile是用来构建docker镜像的文件!即一个参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build构建一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、#表示注解
4、每个指令都会创建一个新的镜像层,并提交
FROM #基础镜像,构建的基础
MAINTAINER #镜像作者,名字+邮箱
RUN #镜像构建时需要运行的命令
ADD #添加内容,添加对应压缩包
WORKDIR #镜像的工作目录
VOLUME #挂载目录
EXPOSE #指定保留端口
CMD #指定容器启动时运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时运行的命令,可追加命令
ONBUILD #当构建一个被继承Dockerfile,运行ONBUILD的指令
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建时设置环境变量
1、编写dockerfile文件
FROM centos:7
MAINTAINER jzq<4561032864@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
RUN yum -y install net-tools
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD echo $MYPATH
CMD echo "------end------"
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
2、通过dockerfile构建镜像
-f dockerfile文件路径
-t 镜像名:[tag]
[root@localhost docker-test-volume]# docker build -f dockerfile -t mytomcat:0.1 .
Successfully built e57b9ac707f3
Successfully tagged mytomcat:0.1
3、启动容器
[root@localhost docker-test-volume]# docker run -d -p 9090:8080 --name jzqtomcat -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs mytomcat:0.1
Docker使用的是Linux的桥接模式,宿主机中有一个Docker容器的网桥,默认是Docker0。容器和宿主机、容器和容器之间通过网桥通信。
每启动一个容器都会生成一个默认IP,容器在没有指定网络的情况下,都通过宿主机的docker0路由。容器和docker0通过Veth-pair桥接,容器之间通行通过Veth-pair进行转发。
Docker中的所有网络接口都是虚拟接口,以提高效率!
通过–link命令链接对应容器,通过服务名链接对方容器
[root@localhost ~]# docker run -d -P --link tomcat01 --name tomcat03 mytomcat:0.1
0fd71d0f9ca4a6fc66d9781a54471e992858f70c393b4ebde3c9d9711b82e8da
[root@localhost ~]# docker exec -it tomcat03 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.130 ms
–link 将容器的hosts文件中添加了对应容器的映射
[root@localhost ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat01 8d817446bc33
172.17.0.3 0fd71d0f9ca4
实际开发中不建议使用–link。
实际开发中使用自定义网络,docker0不支持容器名链接!
docker中的默认网络
# 网络模式
bridge:桥接 docker0(默认)
host:和宿主机共享网络
none:不配置网络
container:容器之间网络直连(用的少,局限大!)
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c6264498cf24 bridge bridge local
9e3b2d4c1ebf host host local
2bc8819b213d none null local
启动容器时默认会加–net bridge参数(指定使用docker0网络)
[root@localhost ~]# docker run -d -P --name tomcat01 --net bridge mytomcat:0.1
[root@localhost ~]# docker run -d -P --name tomcat01 mytomcat:0.1
自定义网络
# --driver 指定网络模式(bridge)
# --subnet 指定子网(192.167.0.0/16 子网分配范围:192.167.0.2~192.167.255.255)
# --gateway 指定网关(192.167.0.1 子网通过网关转发)
[root@localhost ~]# docker network create --driver bridge --subnet 192.167.0.0/16 --gateway 192.167.0.1 mynet
[root@localhost ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
c6264498cf24 bridge bridge local
9e3b2d4c1ebf host host local
d192466a3824 mynet bridge local
2bc8819b213d none null local
[root@localhost ~]# docker run -d -P --name tomcat01 --net mynet mytomcat:0.1
6fd71c3425b4f203f8a0a10ad39d862ce62a6001a7d1d0f9e82fc56b902dffd9
[root@localhost ~]# docker run -d -P --name tomcat02 --net mynet mytomcat:0.1
a4418aed46e1af6b5bd1eab92b82cc2beb6826198ea6bcfe9ec93e248b53293c
[root@localhost ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.167.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.167.0.3): icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from tomcat02.mynet (192.167.0.3): icmp_seq=2 ttl=64 time=0.139 ms
不同网络之间的容器需要连通之后才可以通信
将tomcat-net-0容器连通到mynet网络中,即可和mynet网络中的容器进行通信
[root@localhost ~]# docker network connect mynet tomcat-net-0
[root@localhost ~]# docker network create redis --subnet 172.38.0.0/16 --gateway 172.38.0.1
2、脚本创建6个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
2、脚本启动6个redis容器
for port in $(seq 1 6);
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} -v /mydata/redis/node-${port}/data:/data -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
3、创建集群
[root@localhost redis-cluster]# docker exec -it redis-1 /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
[root@localhost redis-cluster]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof nodes.conf
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.3
8.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-r
eplicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379
replicates c96ccff79ee7aff3c8b96fb96b202f5a15101f2f
S: 02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379
replicates b05fe96e65a02f7e95874caf5ee1dada05e409ce
S: 7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379
replicates b861d4b0bca2678655faea2fe97b978e32b69d8e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379
slots: (0 slots) slave
replicates c96ccff79ee7aff3c8b96fb96b202f5a15101f2f
S: 02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379
slots: (0 slots) slave
replicates b05fe96e65a02f7e95874caf5ee1dada05e409ce
S: 7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379
slots: (0 slots) slave
replicates b861d4b0bca2678655faea2fe97b978e32b69d8e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4、链接集群
/data # redis-cli -c
127.0.0.1:6379> cluster nodes
b861d4b0bca2678655faea2fe97b978e32b69d8e 172.38.0.12:6379@16379 master - 0 1649301865000 2 connected 5461-10922
02f9c3cd665530a3b1b6c7a1f486530266a6654b 172.38.0.15:6379@16379 master - 0 1649301865000 9 connected 0-5460
7dfb45a1f04b59f0c89b33f3e0b291df67c96bc6 172.38.0.16:6379@16379 slave b861d4b0bca2678655faea2fe97b978e32b69d8e 0 1649301865512 6 connected
b05fe96e65a02f7e95874caf5ee1dada05e409ce 172.38.0.11:6379@16379 myself,slave 02f9c3cd665530a3b1b6c7a1f486530266a6654b 0 1649301864000 1 connected
c96ccff79ee7aff3c8b96fb96b202f5a15101f2f 172.38.0.13:6379@16379 slave dc87525aac267aeee25a458983c0c5d0631c89a0 0 1649301866052 7 connected
dc87525aac267aeee25a458983c0c5d0631c89a0 172.38.0.14:6379@16379 master - 0 1649301865728 7 connected 10923-16383
172.38.0.12:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"