出现原因:解决项目发布时的环境部署问题。
vm:linux centos原生镜像,几个G,几分钟。
docker:隔离,镜像(核心环境4m+jdk+mysql)十分小巧,运行镜像就可以了,秒级启动。
官网
Docker Hub
每一个容器就是一个app和lib的集合,不同容器相互隔离,不同容器共用的只有内核。
Docker的好处
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //自己找一个快的
4.安装docker
//可以先更新下yum软件包索引
yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
//使用查看version命令判断是否安装成功
docker version
sudo docker run hello-world
docker images
//删除软件
sudo yum remove docker-ce docker-ce-cli containerd.io
//删除文件
sudo rm -rf /var/lib/docker
帮助命令
docker version #显示docker版本信息
docker info #显示docker的系统信息,包括镜像和容器数量
docker 命令 --help #帮助命令
镜像命令
- docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
- docker search mysql 查找某镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10428 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3870 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 763 [OK]
docker pull mysql
Using default tag: latest 如果不指定版本会使用最新版
latest: Pulling from library/mysql
a076a628af6f: Pull complete 分层下载,docker image的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest 真实的下载地址
#以下两个命令等价
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
- docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists 已经存在的不会再次下载
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker rmi -f 镜像id #删除指定的容器
docker rmi -f $(docker images -aq) #删除所有容器
容器命令
docker pull centos #下载一个centos镜像来完
docker run [可选参数] image
#参数说明
--name="xxx" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
#测试并进入容器
[root@192 docker]# docker run -it centos /bin/bash
[root@d0d6f15130b2 /]#
#退出
exit 直接退出
Ctrl+P+Q 容器不停止退出
docker ps 列出当前正在运行的容器
-a 列出当前正在运行的容器+历史运行过的容器
-n=num 限定显示数量
-q 只显示imageid
docker rm 容器id 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) 删除所有容器
其他命令
#后台启动容器
docker run -d 容器名
此时调用docker ps 发现centos 停止了
docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
#举个例子
docker logs -tf --tail 10 容器id
docker top 容器id 查看进程信息
docker inspect 容器id 查看容器的信息
进入当前正在运行的容器
通常容器都是后台执行的,需要进入容器,修改一些配置
#方式一
docker exec -it 容器id
#方式二
docker attach 容器id
这两个区别:
docker exec 相当于打开了一个新的终端,可以在里面操作
docker attach 进入容器正在执行的终端
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的地路径
常用命令总结
问题: 每次改动nginx配置文件,都需要进入容器内部,十分麻烦若是可以在容器外提供一个映射路径,直接修改容器内部的文件多好。 -v 数据卷?
#官方文档的使用
docker run -it --rm tomcat:9.0
#我们之前启动都是后台,停止了容器之后,容器还是可以查到 上边的命令一般用于测试,用完即删除。
#可以先下载再启动
docker pull tomcat
#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
#访问发现404,那就进入tomcat看一哈怎么回事
docker exec -it tomcat01 /bin/bash
root@429a860a7d70:/usr/local/tomcat# cd webapps
root@429a860a7d70:/usr/local/tomcat/webapps# ls
root@429a860a7d70:/usr/local/tomcat/webapps# 呵,啥玩意都没有!
思考:每次出问题都要进入容器内改,真麻烦啊,要有文件映射就好了
#es暴露的端口很多
#es十分耗费内存
#es的数据一般需要放置到安全目录挂载
# --net somenetwork ?是网络配置
#启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#发现他妈的卡死了
docker stats 查看cpu状态
#关闭,增加内存限制,修改配置文件, -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
思考:如果两个不同容器的服务要互相调用,如何处理
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时库、环境变量和配置文件。
得到镜像的方式
Docker镜像加载原理
UnionFS(联合文件系统):UnionFS是一种分层,轻量级且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,联合文件系统是Docker的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作出具体应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,最终的文件系统会包含所有底层的文件和目录。
bootfs主要包含bootloader和kernal,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,再Docker镜像的最底层时bootfs,这一层与我们典型的Linux/Unix系统一样,包含boot加载器和内核。当boot加载完成之后整个内核都再内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs,再bootfs之上。包含典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统的发行版,比如Ubuntu,Centos等等。
我们平时安装进虚拟机的系统很大,但是docker中却很小,是因为rootfs小,只需要包含最基本的命令,工具和程序库就行了。不同的系统bootfs基本一致,rootfs有差别,不同发行版可以共用bootfs。
分层的好处
共用资源!所有的Docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
一个概念
Docker镜像都是只读的,当容器启动的时候,一个新的可写层被加载到镜像的顶部,这一层就是我们通常说的容器层,容器之下的都叫镜像层!
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
完成容器–>镜像,类似虚拟机中的快照
dcoker理念回顾
暴露需求:数据持久化的问题!
使用方式一、直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
#匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有volume的情况
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local 31c5216d46a8b09cf0c597cf69238c22fe44e716c073d2f0f1048207be972a20
#31c5216d46a8b09cf0c597cf69238c22fe44e716c073d2f0f1048207be972a20这就是匿名挂载
#具名挂载
docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
#查看所有volume的情况
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local juming
#注意如果不指定外部路径都挂载到哪里呢?用docker inspect 容器id 查看一下:/var/lib/docker/volumes/XX
"Mounts": [
{
"Type": "volume",
"Name": "juming",
"Source": "/var/lib/docker/volumes/juming/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
#ro 只读
#rw 读写
#一旦设置了容器权限,容器对我们挂载出来的内容就会有限定,如果是ro,那么只能通过宿主机来写操作,容器内只读。
docker run -d -P --name nginx02 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming:/etc/nginx:rw nginx
使用方式二、使用DockerFile
啥是DockerFile
#创建一个脚本文件
vim dockerfile1
#文件内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "------end-------"
CMD /bin/bash
#构建自己的镜像
docker build -f dockerfile1 -t mycentos:1.0 .
#过程
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 176268be25b8
Removing intermediate container 176268be25b8
---> 6d09cf53fd1a
Step 3/4 : CMD echo "------end-------"
---> Running in 9f2d7a3e0151
Removing intermediate container 9f2d7a3e0151
---> c79da7db25f6
Step 4/4 : CMD /bin/bash
---> Running in 43c82072a96e
Removing intermediate container 43c82072a96e
---> da093e0150d7
Successfully built da093e0150d7
Successfully tagged mycentos:1.0
#启动自己的镜像
[root@192 ceshi]# docker run -it da093e0150d7 /bin/bash
[root@42b66e4c9555 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
#发现存在volume01和volume02,这是匿名挂载,使用docker inspect 查看一下
"Mounts": [
{
"Type": "volume",
"Name": "a08e9c150598aec159c5c946d1831cd33e44b9a5a2891d463c2f8b179fde48ea",
"Source": "/var/lib/docker/volumes/a08e9c150598aec159c5c946d1831cd33e44b9a5a2891d463c2f8b179fde48ea/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "e4a1a9abb52583f42303036f9e7ad9ca0afe391d6dd03177a109bfd05231f176",
"Source": "/var/lib/docker/volumes/e4a1a9abb52583f42303036f9e7ad9ca0afe391d6dd03177a109bfd05231f176/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
数据卷容器
#启动两个自制的centos
docker run -it --name docker01 da093e0150d7
docker run -it --name docker02 --volumes-from docker01 da093e0150d7
#发现在某个volume01或volume02中新建文件,另一个容器内也可以访问到
结论
构建步骤
很多官方镜像都是基础包,我们需要定制化自己的镜像
基础知识
DockerFile的命令
FORM 基础镜像,一切从这开始
MAINTAINER 镜像的编写者,姓名+邮箱
RUN 镜像构建需要运行的环境
ADD 添加内容,比如tomcat压缩包
WORKDIR 镜像的工作目录(RUN,CMD,ENTRYPOINT,COPY,ADD设置工作目录)
VOLUME 挂载卷,挂载主机目录
EXPOSE 指定暴露端口
RUN 构建镜像时运行的shell命令
CMD 运行容器时执行的命令,只有最后一个会生效
ENTRYPOINT 运行容器时执行的命令,可以追加命令
ONBUILD 当构建一个被继承的DockerFile的时候就会运行ONBUILD的指令,是一个触发指令
COPY 类似ADD,将文件拷贝到镜像中
ENV 构建的时候设置环境变量
构建一个试一哈
#1.编写DockerFile文件
FORM centos
MAINTAINER hsw<xxx@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD /bin/bash
#2.构建镜像
docker build -f dockerfile文件路径 -t 镜像名:tag .
#3.测试运行
执行这个centos时候 pwd会发现在 /usr/local目录下
使用docker history 镜像id,就可以查看镜像的构建步骤
CMD和ENTRYPOINT的区别
百度一下:你就知道
docker run -d -P --name tomcat01 tomcat
#查看容器内部网络ip
docker exec -it tomcat01 ip addr
#在主机上ping这个地址发现可以ping通
#在主机上使用ip addr 查看发现每启动一个容器就会多一个网卡
原理
#docker中提供了--link 来解决这个问题
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#此时直接用tomcat03 ping tomcat02就可以ping通
docker exec -it tomcat03 ping tomcat02
#但是tomcat02 不能直接 ping 通 tomcat03
#--link就是在hosts文件中增加了一个地址映射,太笨了不推荐
#查看所有的docker网络
[root@192 tomcatdockerfile]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f6f3d8ff1701 bridge bridge local
5aa0a84471a1 host host local
806862b61a55 none null local
网络模式
#之前直接启动的默认就是 --net bridge
docker run -d -P --name tomcat01 --net bridge tomcat
#可以自定义一个网络
[root@192 tomcatdockerfile]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
91ad28c5515db4d60fd0b5f6956ee7a6f75a9c643061537bd576deca9537cb51
[root@192 tomcatdockerfile]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f6f3d8ff1701 bridge bridge local
5aa0a84471a1 host host local
91ad28c5515d mynet bridge local
806862b61a55 none null local
#把服务放在自定义网络中
docker run -d -P --name tomcat01 --net mynet tomcat
[root@192 tomcatdockerfile]# docker run -d -P --name tomcat01 --net mynet tomcat
13fbe1f00dc9c452d8a72e19d631a2feaedb9a215168d0266188a1a06509882c
[root@192 tomcatdockerfile]# docker run -d -P --name tomcat02 --net mynet tomcat
64d21d6c251811e39275e8b20a2652fd966e587613c17ad58b36dafc97122b41
[root@192 tomcatdockerfile]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "91ad28c5515db4d60fd0b5f6956ee7a6f75a9c643061537bd576deca9537cb51",
"Created": "2021-01-30T10:51:48.978637737+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"13fbe1f00dc9c452d8a72e19d631a2feaedb9a215168d0266188a1a06509882c": {
"Name": "tomcat01",
"EndpointID": "fbdf209fc180f71fd278baf3eb3d10a236b60bcaed9cb59f9f1ee04d14c8b180",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"64d21d6c251811e39275e8b20a2652fd966e587613c17ad58b36dafc97122b41": {
"Name": "tomcat02",
"EndpointID": "d3bda84e06339c5d53f52244175066c3701f8a528bf2aeeb808b4edcc88664ff",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
自定义网络的好处
[root@192 tomcatdockerfile]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.103 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.114 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.060 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.098 ms
[root@192 tomcatdockerfile]# docker network create redis --subnet 172.38.0.0/16
9af68e838b7437859c23b32f97dd1b025bc7a7c62346dc560dc79bc1ef69891c
[root@192 tomcatdockerfile]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f6f3d8ff1701 bridge bridge local
5aa0a84471a1 host host local
91ad28c5515d mynet bridge local
806862b61a55 none null local
9af68e838b74 redis bridge local
[root@192 tomcatdockerfile]# docker network inspect redis
[
{
"Name": "redis",
"Id": "9af68e838b7437859c23b32f97dd1b025bc7a7c62346dc560dc79bc1ef69891c",
"Created": "2021-01-30T12:26:35.27387273+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.38.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
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
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#随便进入一个redis
docker exec -it redis-1 /bin/sh
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
#进入集群
redis-cli -c
#查看节点
127.0.0.1:6379> cluster nodes
044329821e386106e1375b483705fe4e653032f2 172.38.0.11:6379@16379 myself,master - 0 1611982214000 1 connected 0-5460
092e120cbb5e5bc2d07f74e42e7825c5ed9b3c05 172.38.0.15:6379@16379 slave 044329821e386106e1375b483705fe4e653032f2 0 1611982215000 5 connected
0d7f5cab6f86ce24e07985035f8e15ebe7a91c25 172.38.0.14:6379@16379 slave e8568020c79eeb8fbfff115974103f6e2d42bcce 0 1611982215517 4 connected
6da03576e6b11fee84a59bb7a49a851c766cff0b 172.38.0.16:6379@16379 slave f30d39b45a32e6ec0187fa1e88d12d1c44a56386 0 1611982215115 6 connected
f30d39b45a32e6ec0187fa1e88d12d1c44a56386 172.38.0.12:6379@16379 master - 0 1611982215115 2 connected 5461-10922
e8568020c79eeb8fbfff115974103f6e2d42bcce 172.38.0.13:6379@16379 master - 0 1611982216122 3 connected 10923-16383
#存放数据测试
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
#13存放数据把此容器停掉
[root@192 tomcatdockerfile]# docker stop 9cfb2d666fe8
9cfb2d666fe8
#再次获取数据,依然可以获取到
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"
未完。。。转去学Spring Cloud