五、Docker 网络
Docker0
清空所有环境
# 移除所有容器
[root@vinjcent ~]# docker rm -f $(docker ps -aq)
# 移除所有镜像
[root@vinjcent ~]# docker rmi -f $(docker images -aq)
测试
三个网络分别代表三种不同的环境
# 问题: docker 是如何处理容器网络访问
[root@vinjcent ~]# docker run -d -P --name tomcat01 tomcat
[root@vinjcent ~]# docker exec -it tomcat01 /bin/bash
# 由于没有ip命令,进入容器中执行
apt-get update && apt-get install -y iproute2
# 查看容器的内部网络地址 ip addr 发现容器启动的时候会得到一个 eth0@if33 ip地址,由docker分配
root@079b99b77cc9:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
### 思考: Linux 能不能ping通容器内部
# 可以看到能够ping通 docker 内部
[root@vinjcent ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.295 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.103 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.155 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.153 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.149 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.150 ms
64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.207 ms
64 bytes from 172.17.0.2: icmp_seq=8 ttl=64 time=0.172 ms
64 bytes from 172.17.0.2: icmp_seq=9 ttl=64 time=0.148 ms
原理
192.168.0.1 路由器
192.168.0.3 比如连到 WIFI 的到这个网络地址
由于属于同一网段,能够ping通
- 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0
桥接模式:使用的是 evth-pair 技术
再次在 Linux 本地测试命令ip addr
# 发现这个容器带来的网卡,都是一对对的 如上面的32-33
# evth-pair 即使一对的虚拟设备,是成对出现的,一段连接着协议,一段彼此相连
# 正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备
- 测试下 tomcat01 和 tomcat02
# 创建 tomcat02 容器
[root@vinjcent ~]# docker run -d -P --name tomcat02 tomcat
[root@vinjcent ~]# docker exec -it tomcat01 /bin/bash
# 由于没有ip、ping命令,进入容器中执行
apt-get update && apt-get install -y iproute2 && apt install iputils-ping
# 查看正在运行的容器
[root@vinjcent ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29f50ce3b3d7 tomcat "catalina.sh run" 17 minutes ago Up 17 minutes 0.0.0.0:49158->8080/tcp, :::49158->8080/tcp tomcat02
079b99b77cc9 tomcat "catalina.sh run" 2 hours ago Up 2 hours 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat01
# 进入 tomcat02 容器
[root@vinjcent ~]# docker exec -it 29f50ce3b3d7 /bin/bash
# ping 一下 tomcat01
root@29f50ce3b3d7:/usr/local/tomcat# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.128 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.189 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.251 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.168 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.391 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.205 ms
64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.187 ms
# tomcat02 的ip地址
root@29f50ce3b3d7:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 这说明,容器与容器之间是可以互相ping的
33: veth2e18f67@if32
绘制一个网络模型图
结论:tomcat01 和 tomcat02 是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是 docker0 路由的,docker 会给我们的容器分配一个默认的可用 IP
小结
Docker 使用的是 Linux 桥接,宿主机中是一个 Docker 容器的网桥 docker0
只要容器删除,对应的一对网桥也就消失了
思考:由于每次容器启动都会为容器分配id,在实现 database url = ip 时,需要更换数据库的 ip,我们希望通过如微服务中的 Feign 技术,通过服务名来进行访问容器
5.1 --link
[root@vinjcent ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
[root@vinjcent ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
# 进入 tomcat03 容器执行以下命令
apt-get update && apt install iputils-ping
# 发现通过 --link 就可以解决网络连通问题
[root@vinjcent ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.128 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.119 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.102 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.089 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=6 ttl=64 time=0.084 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=7 ttl=64 time=0.144 ms
# 反向可以ping通吗?
[root@vinjcent ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@vinjcent ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e680055e32f3 tomcat "catalina.sh run" 40 minutes ago Up 40 minutes 0.0.0.0:49159->8080/tcp, :::49159->8080/tcp tomcat03
29f50ce3b3d7 tomcat "catalina.sh run" 3 hours ago Up 3 hours 0.0.0.0:49158->8080/tcp, :::49158->8080/tcp tomcat02
079b99b77cc9 tomcat "catalina.sh run" 5 hours ago Up 5 hours 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat01
# 查看具体的某一个容器
[root@vinjcent ~]# docker inspect 29f50ce3b3d7
### 实质上 tomcat03 就是在本地配置了 tomcat02 的配置 (不推荐使用)
# 查看 hosts 文件配置
[root@vinjcent ~]# 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.3 tomcat02 29f50ce3b3d7 # 这就是配置的地方
172.17.0.4 e680055e32f3
5.2 自定义网络
查看所有的docker网络
[root@vinjcent ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9b203b4a0922 bridge bridge local
b062cd1dc605 host host local
a956759ec7df none null local
几种网络模式
bridge:桥接
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的较少,局限性很大)
测试
# 直接启动的命令 --net bridge,而这个就是docker0
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点: 默认的,域名不能访问,--link可以打通连接
自定义一个网络
# 帮助命令
[root@vinjcent ~]# docker network --help
# --driver [网络模式]
# --subnet [子网地址]
# --gateway [网关]
# 自定义一个网络
[root@vinjcent ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 div_network
# 查看docker网络列表
[root@vinjcent ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9b203b4a0922 bridge bridge local
fc77c0d825eb div_network bridge local
b062cd1dc605 host host local
a956759ec7df none null local
# 查看自定义的网络配置信息
[root@vinjcent ~]# docker network inspect div_network
根据自定义的网络,开启两个容器
### 由于从docker拉下来的镜像没有ping命令,并且在自定义的网络下,容器不能安装apt-get update、apt-get install iputils-ping
### 需要手动创建一个dockerfile镜像,创建的docekrfile文件内容如下
# =====================================文件内容=============================================
FROM centos:7
MAINTAINER vinjcent<2573552788@qq.com>
COPY readme.txt /url/local/readme.txt
ADD jdk-8u202-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/
RUN yum -y install vim
RUN yum -y install iputils
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
# =====================================文件内容=============================================
# 创建镜像命令
[root@vinjcent vinjcent]# docker build -f div_tomcat_dockerfile -t div_tomcat .
# 查看镜像
[root@vinjcent vinjcent]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
div_tomcat latest cb339a54a2c5 4 minutes ago 1.02GB
tomcat latest 52b67ab29b74 5 days ago 680MB
centos 7 eeb6ee3f44bd 9 months ago 204MB
# 运行自定义的两个镜像容器
[root@vinjcent vinjcent]# docker run -d -P --name tomcat-net-01 --net div_network div_tomcat
b0954fddd39611f4747dd89f8cc1955c20fbb9105bab8cebf16e2d5b4c32be00
[root@vinjcent vinjcent]# docker run -d -P --name tomcat-net-02 --net div_network div_tomcat
255128d366209e541a05789676af3da3c3da008c1d43e3b835bb0c9678dd89b9
# 查看自定义网络配置信息
[root@vinjcent ~]# docker network inspect div_network
### 测试在自定义网络下ping命令操作两个容器
# 不使用 --link 也可以ping名字了
[root@vinjcent vinjcent]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=2 ttl=64 time=0.193 ms
64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=3 ttl=64 time=0.092 ms
64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=4 ttl=64 time=0.213 ms
64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=5 ttl=64 time=0.117 ms
自定义的网络docker已经维护好了对应的关系,推荐使用这样的网络
好处
- redis:不同的集群使用不同的网络,保证集群是安全健康的
- mysql:不同的集群使用不同的网络,保证集群是安全健康的
5.3 网络连通
假设有这种情形,如下图所示
# 准备的不同容器,带有-net名字的是自定义的网络,而没有的则是docker01下的网络
[root@vinjcent /]# docker run -d -P --name tomcat01 tomcat
dd168102688c2d59379092ab6d8aca21ed57bb4286fa92eab0d7138c6e3489b1
[root@vinjcent /]# docker run -d -P --name tomcat02 tomcat
b377880ad622e9a05d15b50a43733e155957e2e7abb709c2bf5c7182815ea072
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b377880ad622 tomcat "catalina.sh run" 4 seconds ago Up 4 seconds 0.0.0.0:49161->8080/tcp, :::49161->8080/tcp tomcat02
dd168102688c tomcat "catalina.sh run" 7 seconds ago Up 7 seconds 0.0.0.0:49160->8080/tcp, :::49160->8080/tcp tomcat01
255128d36620 div_tomcat "/bin/sh -c '/usr/lo…" 15 minutes ago Up 15 minutes 0.0.0.0:49159->8080/tcp, :::49159->8080/tcp tomcat-net-02
b0954fddd396 div_tomcat "/bin/sh -c '/usr/lo…" 15 minutes ago Up 15 minutes 0.0.0.0:49158->8080/tcp, :::49158->8080/tcp tomcat-net-01
# 由于从dockhub上拉下来的容器没有ping命令,需要手动安装
# 进入tomcat01容器,执行以下命令
[root@vinjcent /]# docker exec -it tomcat01 /bin/bash
root@dd168102688c:/usr/local/tomcat# apt-get update && apt install iputils-ping
ping测试
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b377880ad622 tomcat "catalina.sh run" 15 minutes ago Up 15 minutes 0.0.0.0:49161->8080/tcp, :::49161->8080/tcp tomcat02
dd168102688c tomcat "catalina.sh run" 15 minutes ago Up 15 minutes 0.0.0.0:49160->8080/tcp, :::49160->8080/tcp tomcat01
255128d36620 div_tomcat "/bin/sh -c '/usr/lo…" 30 minutes ago Up 30 minutes 0.0.0.0:49159->8080/tcp, :::49159->8080/tcp tomcat-net-02
b0954fddd396 div_tomcat "/bin/sh -c '/usr/lo…" 30 minutes ago Up 30 minutes 0.0.0.0:49158->8080/tcp, :::49158->8080/tcp tomcat-net-01
[root@vinjcent /]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
查看docker network [options]
命令
[root@vinjcent vinjcent]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network # 需要用到这个命令,连接一个容器到一个网络
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
测试
# 测试打通 tomcat01(容器) --- div_network(网络)
# 将 tomcat01容器与div_network网络相连
[root@vinjcent /]# docker network connect div_network tomcat01
# 查看div_network的网络信息
[root@vinjcent /]# docker network inspect div_network
# 实现了一个容器两个ip地址
# 再次尝试使用tomcat01容器 "ping" tomcat-net-01容器
[root@vinjcent /]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=2 ttl=64 time=0.156 ms
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=3 ttl=64 time=0.120 ms
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=4 ttl=64 time=0.136 ms
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=5 ttl=64 time=0.086 ms
64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=6 ttl=64 time=0.117 ms
# tomcat02依旧是打不通的
[root@vinjcent /]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
5.4 实战:部署Redis集群
# 创建redis网络
[root@vinjcent /]# docker network create redis --subnet 172.38.0.0/16
5c0197bc1160253f042c2a5dda30ccebc499741c04a82a7fe4e02eeea091a668
[root@vinjcent /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
efedc44687a5 bridge bridge local
4e896df003be div_network bridge local
b062cd1dc605 host host local
a956759ec7df none null local
5c0197bc1160 redis bridge local
# 循环创建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 node.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 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; \
# redis-1
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
# redis-2
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
# redis-3
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
# redis-4
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
# redis-5
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
# redis-6
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
# 查看6个redis容器
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e628dabd1b2 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6
7faf314737da redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 11 seconds ago Up 10 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5
d4aa7e9995a4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 18 seconds ago Up 17 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4
a7047f1c2eb8 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 23 seconds ago Up 22 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3
0b62f39e1464 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 28 seconds ago Up 27 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2
59c162616b22 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 33 seconds ago Up 32 seconds 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1
# 创建集群
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6
379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 进入redis控制台命令窗口
/data # redis-cli -c
# 设置键值对
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
# 可以看到直接跟 redis-3相连
测试
# 将redis-3这个容器停止
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e628dabd1b2 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6
7faf314737da redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5
d4aa7e9995a4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4
# 这里
a7047f1c2eb8 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3
0b62f39e1464 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2
59c162616b22 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1
[root@vinjcent /]# docker stop a7047f1c2eb8
# 在redis-1重新进入redis-cli命令窗口
/data # redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"
# 可以发现redis-4变成了ma