docker 网络基础、docker部署实战redis集群

Docker 网络

网络基础

其中 Docker 使用到的与 Linux 网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。

网络名称空间

为了支持网络协议栈的多个实例,Linux 在网络协议栈中引入了网络名称空间(Network Namespace),这些独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境,而 Docker 正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在 Linux 的网络命名空间内可以有自己独立的 Iptables 来转发、NAT 及 IP 包过滤等功能。
Linux 的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。最好的办法就是让这些全局变量成为一个 Net Namespace 变量的成员,然后为了协议栈的函数调用加入一个Namespace 参数。这就是 Linux 网络名称空间的核心。所以的网络设备都只能属于一个网络名称空间。当然,通常的物理网络设备只能关联到root 这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空间中,而且可以在这些名称空间之间移动。
在这里插入图片描述

Veth 设备

引入Veth 设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间链接起来。由于要连接的两个网络命名空间,所以 Veth 设备是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的 peer。在 Veth 设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
在这里插入图片描述

Veth 设备(成对)

1.创建一个命名空间
[root@net ~]# ip netns add test01
[root@net ~]# ip netns add test02
[root@net ~]# ip netns list
test02
test01

2.创建veth设备对
#创建一个ip连接,设备名字veth 类型veth,另一半的名字veth001
[root@net ~]# ip link add veth type veth peer name veth001
# 查看会生成两个veth设备,互为对方的peer
[root@net ~]# ip a

5: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 7e:47:ff:05:d8:7c brd ff:ff:ff:ff:ff:ff
6: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 92:52:3d:58:09:2f brd ff:ff:ff:ff:ff:ff

3.绑定命名空间
[root@net ~]# ip link set veth001 netns test01

# 这时候查看会看不到veth001
[root@net ~]# ip link show | grep veth
6: veth@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000


4.将 Veth 分配 IP
#设置ip
[root@net ~]# ip netns exec test01 ip addr add 172.16.0.111/20 dev veth001

#绑定
[root@net ~]# ip netns exec test01 ip link set dev veth001 up

#查看
[root@net ~]# ip netns exec test01 ip a
[root@net ~]# ip netns exec test01 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth001@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 7e:47:ff:05:d8:7c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.111/20 scope global veth001
       valid_lft forever preferred_lft forever
    inet6 fe80::7c47:ffff:fe05:d87c/64 scope link 
       valid_lft forever preferred_lft forever


这个时候双方都通了


5.查看对端veth设备
[root@net ~]# ip netns exec test01 ethtool -S veth001
NIC statistics:
     peer_ifindex: 6
[root@net ~]# ip a|grep 6
6: veth@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    inet 172.16.0.112/20 scope global veth
    inet6 fe80::9052:3dff:fe58:92f/64 scope link 


6.为对端 Veth 设备设置 IP
[root@net ~]# ip addr add 172.16.0.112/20 dev veth
[root@net ~]# ip link set dev veth down
[root@net ~]# ip link set dev veth up
[root@net ~]# ping 172.16.0.111
PING 172.16.0.111 (172.16.0.111) 56(84) bytes of data.
64 bytes from 172.16.0.111: icmp_seq=1 ttl=64 time=0.187 ms
......

[root@net ~]# ping 172.16.0.112
PING 172.16.0.112 (172.16.0.112) 56(84) bytes of data.
64 bytes from 172.16.0.112: icmp_seq=1 ttl=64 time=0.185 ms
64 bytes from 172.16.0.112: icmp_seq=2 ttl=64 time=0.056 ms

注意:
docker 的网络连接就是建立一个网络空间,与系统自带的空间互相隔离,这时候需要一种设备进行互相连接诶对方,从而导致互相通信。这种设备类似于交换机,蓝牙,veth等。

其实docker也就是通过veth通信的,具体可以通过docker run -d nginx

docker ps
ip a

三者结合起来可以测试一下

网桥

Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。 网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。
网桥设备 brO 绑定了 eth0、 eth1 。对于网络协议的上层来说,只看得到 brO 。因为桥接是在数据链路层实现的 ,上层不需要关心桥接的细节,于是协议枝上层需要发送的报文被送到 brO ,网桥设备的处理代码判断报文该被转发到 eth0 还是 ethl ,或者两者皆转发。反过来,从 ethO 或从 ethl 接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。 而有时 ethl 也可能会作为报文的源地址或目的地址 直接参与报文的发送与接收,从而绕过网桥。
在这里插入图片描述

Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。
网桥是二层的虚拟网络设备, 它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地 址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。

网桥设备 brO 绑定了 eth0、 eth1

Iptables

我们知道, Linux 络协议樵非常高效,同时比较复杂 如果我们希望在数据的处理过程中对关心的数据进行一些操作该怎么做呢? Linux 提供了一套机制来为用户实现自定义的数据包处理过程。
在 Linux 网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在 Linux 网络棋处理数据包的过程中对数据包进行 些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables
Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux网络协议战中灵活的数据包处理机制。

Docker与IPtables

总结

在这里插入图片描述

Docker 网络模式=====重点

Docker 使用 Linux桥接的方式,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址,称为Container-IP,同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主
机 IP]:[容器端口]访问容器
在这里插入图片描述

自定义网络

1.HOST 模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了,网络的隔离性不好。
在这里插入图片描述
在这里插入图片描述

host模式:
用的宿主主机的网卡,其他是隔离的;
容器使用的端口不能和宿主机的端口冲突




[root@\ docker~]# docker run -d --network=host nginx
fe200888c3bbd072b085e970962f3f837a0ff5f3f4c7d8d3eec7f57214e7da37

[root@\ docker~]# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
2.Containe 模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信在这里插入图片描述

containe模式:
和一个指定的容器共享 IP、端口范围等;
两个容器除了网络方面,其他还是隔离的



# 打开一个容器
[root@docker ~]# docker run -d --name nginx1 nginx
c8b6ebd03585a8a84f7272fa05eb41dce5f6bc92de79be4ba5249fcea1512898
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
c8b6ebd03585   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds   80/tcp    nginx1
f46537766a8f   nginx     "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp    nginx
94993fd7d030   nginx     "/docker-entrypoint.…"   4 hours ago     Up 4 hours     80/tcp    busy_liskov


# 使用nginx1网络打开centos容器
[root@docker ~]# docker run -it --network="container:nginx1" centos bash
[root@c8b6ebd03585 /]# 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.4	c8b6ebd03585

#进入nginx1容器里面查看ip
[root@docker ~]# docker exec -it nginx1 bash
root@c8b6ebd03585:/# 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.4	c8b6ebd03585


#可以pig通172.17.0.4:80
[root@\ docker~]# curl 172.17.0.4:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
3.none 模式

使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置IP 等。
这种网络模式下容器只有 lo 回环网络,没有其他网卡。none 模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
在这里插入图片描述

none 模式:
Docker 容器拥有自己的 Network Namespace,这个 Docker 容器没有网卡、IP、路由等信息;
需要自己为 Docker 容器添加网卡、配置 IP 等。

[root@\ docker~]# docker run -dit --name test01 --network none busybox

[root@\ docker~]# docker exec -it test01 ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
4.bridge 模式

当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 vethxxx这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以
通过brctl show 命令查看。
bridge 模式是 docker 的默认网络模式,不写–net 参数,就是 bridge 模式。使用 docker run -p 时,docker实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看
在这里插入图片描述

在这里插入图片描述原理:
我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0。
桥接模式,使用的技术是evth-pir技术。
evth-pir 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。
正因为有这个特性,evth-pir 充当一个桥梁,连接各种虚拟网络设备。
Openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pir技术。
在这里插入图片描述
在这里插入图片描述

结论:

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高。(内网传递文件!)

这里是引用

docker默认模式


1,当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥
[root@\ docker~]# ip a
... ...
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:56:8b:0b:74 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:56ff:fe8b:b74/64 scope link
       valid_lft forever preferred_lft forever




2,从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关

[root@\ docker~]# docker run -d --name ngin11 nginx

[root@\ docker~]# docker inspect ngin11
... ...

bridge:
"Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            ....





测试:Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 vethxxx这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。
在这里插入图片描述
测试:bridge 模式是 docker 的默认网络模式

[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f7dc906b627f   bridge    bridge    local
58a6c53b2452   host      host      local
ef7a1622ba36   none      null      local
[root@docker ~]# docker run  -d --name nginx111 nginx

[root@docker ~]# docker inspect nginx111

......
 "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f7dc906b627f3b2fc27eda2ba9b3d4b48f6f2199ba513583184c0f5918159423",
                    "EndpointID": "a9312fff4ccf5f0dd021198ceb4247b224baf25fb094368debc473db3f1a7c06",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.6",

.....

测试:创建私有网桥

[root@docker ~]# docker network create oldjiang 
06bd6cc0cc522c174640989cbffcf43ae20da075a21d2c8bfe43f5aaef08a314
[root@docker ~]# docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
f7dc906b627f   bridge     bridge    local
58a6c53b2452   host       host      local
ef7a1622ba36   none       null      local
06bd6cc0cc52   oldjiang   bridge    local
[root@docker ~]# docker run -d  --network=oldjiang nginx
02f063d0aff0a0310cd9a1d73fefa3d15bf4c48da59e77ba1680ea5dd6977908
[root@docker ~]# docker run -d  --network=oldjiang  --name nginxxxx nginx
9fb88bfb7602cf20b27a1b2582d83b2d40e5c3a7af72e36f31ce63e6f8ec6748
[root@docker ~]# docker run -d  --network=oldjiang  --name nginxqqqq nginx
d5020d488ff2588c9af17720a1e4595232db205268c116c8d3f3964835ab5614
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS     NAMES
d5020d488ff2   nginx     "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds       80/tcp    nginxqqqq
9fb88bfb7602   nginx     "/docker-entrypoint.…"   13 seconds ago      Up 11 seconds      80/tcp    nginxxxx
02f063d0aff0   nginx     "/docker-entrypoint.…"   26 seconds ago      Up 25 seconds      80/tcp    reverent_khorana
9564502af9ab   nginx     "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes       80/tcp    nginx111

[root@docker ~]# docker run -it --network=oldjiang centos bash

访问成功
[root@76aaed19468c /]# curl nginxqqqq
....
</head>
<body>
<h1>Welcome to nginx!</h1>
.....

访问成功

[root@76aaed19468c /]# curl nginxxxx 
.......
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
........

访问不成功===恰恰证明了--name参数的意义,名字解析到DNS中
[root@76aaed19468c /]# curl  reverent_khorana
curl: (6) Could not resolve host: reverent_khorana

可以使用容器ID 进行测试
[root@76aaed19468c /]# curl 02f063d0aff0
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
···

二、Docker网络

1.理解docker0

测试:
在这里插入图片描述
在这里插入图片描述

[root@net ~]# docker run -d -P --name tomcat01 tomcat
查看容器的内部网络地址,发现容器启动的时候会得到一个71: eth0@if72 ip地址 docker分配的
[root@net ~]# docker exec -it 9d2bb0d9c75f986d5 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
71: eth0@if72: <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通容器内部?
>[root@net ~]# 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=3.00 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.041 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.041/1.522/3.003/1.481 ms

结论:linux可以ping通容器内部


原理:

  • 我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0。
  1. 再次测试ip addr
    在这里插入图片描述

2.在启动一个容器,发现又多了一对网卡
在这里插入图片描述在这里插入图片描述
原理总结:

  • 我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0。
    桥接模式,使用的技术是evth-pir技术。
  • evth-pir 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。
  • 正因为有这个特性,evth-pir 充当一个桥梁,连接各种虚拟网络设备。
  • Openstac,Docker容器之间的连接,OVS的连接,都是使用evth-pir技术。

3.我们测试Tomcat01 与Tomcat02 是否可以ping通?

在这里插入图片描述
结论:容器与容器之间是互相ping通的!

绘制一个网络模型图:
在这里插入图片描述
在这里插入图片描述
结论:Tomcat01 与Tomcat02共用一个路由器 docker0
在这里插入图片描述

  • 所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
  • Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
  • Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高。(内网传递文件!)
  • 只要容器删除,对应网桥就没有了

2.–link的使用

思考:我们编写了一个微服务,database url=ip,项目不重启,数据库IP换掉了,我们希望可以处理这个问题,可以用名字来进行访问容器?
在这里插入图片描述
ping不通如何解决?

[root@net ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
a549596fe336   tomcat    "catalina.sh run"   18 minutes ago   Up 18 minutes   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat02
9d2bb0d9c75f   tomcat    "catalina.sh run"   2 hours ago      Up 2 hours      0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat01
[root@net ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

使用–link解决网络连通的问题!

[root@net ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
0dd99176dcdabe421893e3558e49526cf07833069fb9ff6fd02aa86082367f45
[root@net ~]# 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=1.85 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.043 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.038 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.041 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.038 ms
^C
--- tomcat02 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 61ms
rtt min/avg/max/mdev = 0.038/0.402/1.853/0.725 ms

反向可以ping通吗?===ping不通

[root@net ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

–link原理探究:

[root@net ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b454063db7ca   bridge    bridge    local
3383c91700a8   host      host      local
21c0c716a5ad   none      null      local
[root@net ~]# docker network inspect b454063db7ca
[
    {
        "Name": "bridge",
        "Id": "b454063db7ca28b496e47b9411316bc658e53b226a7b6d69d8389fac5e23c29c",
        "Created": "2021-07-20T18:30:26.344455588+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
  .......
            "0dd99176dcdabe421893e3558e49526cf07833069fb9ff6fd02aa86082367f45": {
                "Name": "tomcat03",
                "EndpointID": "9ea597d8bf30fb4d5c3ba333f5bf357677666d5a20596e6c909ee11cba6db711",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "9d2bb0d9c75f986d506ff56f3c052f0fe2cb9dee80cbc178f68d3d9a69ca2559": {
                "Name": "tomcat01",
                "EndpointID": "e17c9f8f64cc3ea0ce78e33463b06d1e4f8c53418a914024c16c2d7aafa7ac74",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "a549596fe33691fb33089f9a08d083846b5b9c6dbcc490d51875fad2c9d41ea5": {
                "Name": "tomcat02",
                "EndpointID": "e9142a9a22fce079233daadb8cc696ea0c54055c6bfac6bb312e9bebf0742ec2",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
.......

在这里插入图片描述
其实这个Tomcat03就是在本地配置了Tomcat02的配置。

进入tomcat03 查看hosts配置文件

[root@net ~]# 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 a549596fe336
172.17.0.4	0dd99176dcda

结论:就是在hosts文件内增加了一个172.17.0.3	tomcat02 a549596fe336

现在docker已经不建议使用–link了,我们需要的自定义网络,不使用docker0.
docker0问题:它不支持容器名连接访问

3.自定义网络

1)网络模式:

  • bridge :桥接模式(默认,自己创建也是用桥接模式)
  • none :不配置网络
  • host :主机模式==》和宿主机共享网络
  • container :容器网络连通(用的少)

测试:

1.之前不指定网络模式启动的方式默认是桥接方式(省略了--net bridge)
[root@net ~]# docker run -d -P --name tomcat01 --net bridge tomcat
dc6cc4a1382aad3533bce7c3045c2f46625eaf7eaa8d70c634e4c9a142ca4f80

[root@net ~]# docker run -d -P --name tomcat01 tomcat

docker0的特点:域名不能访问 --link可以打通连接


我门可以自定义一个网络

创建网络的帮助
[root@net ~]# docker network create --help

1.自定义网络
[root@net ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
74cd2667073467496832657dca7c779589b48abb425bc8a498af95f2415c2e6c

注:
--driver bridge          :网络模式
--subnet 192.168.0.0/16  :子网地址 (192.168.0.2-192.168.255.255)
--gateway 192.168.0.1    :网关地址

2.查看网络
[root@net ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b454063db7ca   bridge    bridge    local
3383c91700a8   host      host      local
74cd26670734   mynet     bridge    local
21c0c716a5ad   none      null      local

3.查看自定义网络的详细信息
[root@net ~]# docker network inspect mynet 
[
    {
        "Name": "mynet",
        "Id": "74cd2667073467496832657dca7c779589b48abb425bc8a498af95f2415c2e6c",
        "Created": "2021-07-21T21:50:22.462038006+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": {},
        "Options": {},
        "Labels": {}
    }
]



到这里我们自己的网络就创建好了!



4.使用自己的网络启动
[root@net ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
85dd660f3d7f14996c7e2390ccb91ce70cd46babcfbfe9a648af92a4352d6d81
[root@net ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
91e88decbc13a61c576d15d2903d557fe5aeedfd2c3513e9c8863be0a239d30f
[root@net ~]# docker network inspect mynet 
[
    {
        "Name": "mynet",
        "Id": "74cd2667073467496832657dca7c779589b48abb425bc8a498af95f2415c2e6c",
        "Created": "2021-07-21T21:50:22.462038006+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": {
            "85dd660f3d7f14996c7e2390ccb91ce70cd46babcfbfe9a648af92a4352d6d81": {
                "Name": "tomcat-net-01",
                "EndpointID": "a90c347cfcae7fc1db4194c1e79df8e6746445ac4c282856b8e9eb30fc9ea5c3",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "91e88decbc13a61c576d15d2903d557fe5aeedfd2c3513e9c8863be0a239d30f": {
                "Name": "tomcat-net-02",
                "EndpointID": "d7e4c653d2a011e04107906bbbc0d62b1f9bc442026a072853d8af0d0592c64f",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]


再次测试ping连接
[root@net ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=1.33 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.059 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.048 ms
64 bytes from 192.168.0.3: icmp_seq=6 ttl=64 time=0.044 ms
^C
--- 192.168.0.3 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 39ms
rtt min/avg/max/mdev = 0.044/0.262/1.331/0.478 ms

现在不使用--link也可以ping名字了
[root@net ~]# 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.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.060 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.062 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.061 ms
^C
--- tomcat-net-02 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 86ms
rtt min/avg/max/mdev = 0.040/0.054/0.062/0.009 ms

我们自定义的网络已经帮我们维护好了对应的关系,意见我们这样使用网络!

好处:
redis :不同的集群使用不同的网络,保证集群是安全和健康的!
mysql :不同的集群使用不同的网络,保证集群是安全和健康的!
在这里插入图片描述

网络连通

测试:


[root@net ~]# docker run -d -P --name tomcat02 tomcat
e4f73186432ec9d65aeaeb8b067cd95c774e040f068b574410737b72c384304a
[root@net ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
e4f73186432e   tomcat    "catalina.sh run"   7 seconds ago    Up 6 seconds    0.0.0.0:49164->8080/tcp, :::49164->8080/tcp   tomcat02
91e88decbc13   tomcat    "catalina.sh run"   13 minutes ago   Up 13 minutes   0.0.0.0:49163->8080/tcp, :::49163->8080/tcp   tomcat-net-02
85dd660f3d7f   tomcat    "catalina.sh run"   13 minutes ago   Up 13 minutes   0.0.0.0:49162->8080/tcp, :::49162->8080/tcp   tomcat-net-01
dc6cc4a1382a   tomcat    "catalina.sh run"   24 minutes ago   Up 24 minutes   0.0.0.0:49161->8080/tcp, :::49161->8080/tcp   tomcat01

报错了,基于这种思想使用connect将容器与网络打通
[root@net ~]# docker exec -it tomcat01 ping tomcat-net-02
ping: tomcat-net-02: Name or service not known

docker network --help 帮助文档

在这里插入图片描述
docker network connect --help 帮助文档

在这里插入图片描述
原理图:

在这里插入图片描述
测试:将tomcat01与mynet网络连通

[root@net ~]# docker network connect mynet tomcat01

[root@net ~]# docker network inspect mynet 
"85dd660f3d7f14996c7e2390ccb91ce70cd46babcfbfe9a648af92a4352d6d81": {
                "Name": "tomcat-net-01",
                "EndpointID": "a90c347cfcae7fc1db4194c1e79df8e6746445ac4c282856b8e9eb30fc9ea5c3",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "91e88decbc13a61c576d15d2903d557fe5aeedfd2c3513e9c8863be0a239d30f": {
                "Name": "tomcat-net-02",
                "EndpointID": "d7e4c653d2a011e04107906bbbc0d62b1f9bc442026a072853d8af0d0592c64f",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "dc6cc4a1382aad3533bce7c3045c2f46625eaf7eaa8d70c634e4c9a142ca4f80": {
                "Name": "tomcat01",
                "EndpointID": "fc78b132bd4515a61bbf58be16a67476f147b6e9502b2b4c446dd841567d99c4",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
........

注:
   连通之后就是将tomcat01 放到了mynet网络下
   相当于一个容器两个IP地址
   好比阿里云服务的公网IP与私网IP
   

详看图:
在这里插入图片描述
再次测试Tomcat01与Tomcat-net-01是否能ping通?

01连通OK
[root@net ~]# docker exec -it tomcat01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=2.38 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.050 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.064 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=6 ttl=64 time=0.084 ms
^C
--- tomcat-net-02 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 64ms
rtt min/avg/max/mdev = 0.050/0.450/2.375/0.860 ms


02依旧不通,如有需要重新连接connect一下即可
[root@net ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known


结论:假设要跨网络操作别人,就需要使用docker network connect 连通!

三、redis集群部署实战

在这里插入图片描述

1)创建集群

1.创建redis自定义网络
[root@net ~]# docker network create redis --subnet 172.38.0.0/16
0d1f5f49f69cc8e68e12f1d9d35ccddb4e3cb1e19569d20d2dca1090235bc212

2.查看redis网络
[root@net ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b454063db7ca   bridge    bridge    local
3383c91700a8   host      host      local
74cd26670734   mynet     bridge    local
21c0c716a5ad   none      null      local
0d1f5f49f69c   redis     bridge    local

3.用脚本创建六个redis配置
[root@net ~]# 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

4.查看redis配置
[root@net ~]# cd /mydata/
[root@net mydata]# ls
redis
[root@net mydata]# cd redis/
[root@net redis]# ls
node-1  node-2  node-3  node-4  node-5  node-6
[root@net redis]# cd node-1
[root@net node-1]# ls
conf
[root@net node-1]# cd conf/
[root@net conf]# ls
redis.conf
[root@net conf]# cat 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.11
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes

5.启动六个redis
[root@net conf]# 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

[root@net 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
767f0cade0a2bfc43a7800e069dab8bd6a354d96a0f44c6bf60c2f46e67fd25c
[root@net 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
bd528c98e84af1c4fd66c0d1b79f5c7959a1375cfc27b71ae6043dc48e4d01e6

[root@net 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
323d3e27c53cfff7487c5289ba43318e6d3eba82b84b67a7e1db09c3960c04e7
[root@net 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
d2dd8d1ce99301cf6be49af13d0c985986152fae94ce44eab8d00a8becd688a3
[root@net 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
c5ff6e6271a3ee2ff883104e6d710786b5b4434f8a0382a8c4c268b2a60d0308

6.查看容器redis的进程
[root@net conf]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS              PORTS                                                                                      NAMES
c5ff6e6271a3   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   3 seconds ago        Up 2 seconds        0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
d2dd8d1ce993   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   37 seconds ago       Up 37 seconds       0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
323d3e27c53c   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
bd528c98e84a   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes        0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
767f0cade0a2   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   3 minutes ago        Up 3 minutes        0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
814c74ffc4b2   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   6 minutes ago        Up 6 minutes        0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1


7.创建redis集群
进入redis-1
[root@net conf]# docker exec -it redis-1 /bin/sh
/data # pwd
/data
/data # ls
appendonly.aof  nodes.conf
创建集群
/data # 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-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: 81bb5a1dfc466a1353858303f2aebf562a9d08cd 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 49d9df7e62b76a591739f03a53893ce038702603 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: fb2f55a1fb47b5523b520ef506ff1d795bb20ee6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 47a8cf9598a44434ed6ea29d7272997b8b112ab6 172.38.0.14:6379
   replicates fb2f55a1fb47b5523b520ef506ff1d795bb20ee6
S: 8ba10596bee2dda06c454faaeb8f257edb817107 172.38.0.15:6379
   replicates 81bb5a1dfc466a1353858303f2aebf562a9d08cd
S: 9fe62dbe3cef536a242dcfd1bc3f6bc3f782ef1e 172.38.0.16:6379
   replicates 49d9df7e62b76a591739f03a53893ce038702603
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: 81bb5a1dfc466a1353858303f2aebf562a9d08cd 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 9fe62dbe3cef536a242dcfd1bc3f6bc3f782ef1e 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 49d9df7e62b76a591739f03a53893ce038702603
M: fb2f55a1fb47b5523b520ef506ff1d795bb20ee6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 49d9df7e62b76a591739f03a53893ce038702603 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 47a8cf9598a44434ed6ea29d7272997b8b112ab6 172.38.0.14:6379
   slots: (0 slots) slave
   replicates fb2f55a1fb47b5523b520ef506ff1d795bb20ee6
S: 8ba10596bee2dda06c454faaeb8f257edb817107 172.38.0.15:6379
   slots: (0 slots) slave
   replicates 81bb5a1dfc466a1353858303f2aebf562a9d08cd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.




2)测试集群

1.进入redis集群
/data # redis-cli -c
127.0.0.1:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:164
cluster_stats_messages_pong_sent:182
cluster_stats_messages_sent:346
cluster_stats_messages_ping_received:177
cluster_stats_messages_pong_received:164
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:346

2.查看 redis三主三从节点
127.0.0.1:6379> CLUSTER NODES
9fe62dbe3cef536a242dcfd1bc3f6bc3f782ef1e 172.38.0.16:6379@16379 slave 49d9df7e62b76a591739f03a53893ce038702603 0 1626880662946 6 connected
fb2f55a1fb47b5523b520ef506ff1d795bb20ee6 172.38.0.13:6379@16379 master - 0 1626880662000 3 connected 10923-16383
81bb5a1dfc466a1353858303f2aebf562a9d08cd 172.38.0.11:6379@16379 myself,master - 0 1626880662000 1 connected 0-5460
49d9df7e62b76a591739f03a53893ce038702603 172.38.0.12:6379@16379 master - 0 1626880662541 2 connected 5461-10922
47a8cf9598a44434ed6ea29d7272997b8b112ab6 172.38.0.14:6379@16379 slave fb2f55a1fb47b5523b520ef506ff1d795bb20ee6 0 1626880661518 4 connected
8ba10596bee2dda06c454faaeb8f257edb817107 172.38.0.15:6379@16379 slave 81bb5a1dfc466a1353858303f2aebf562a9d08cd 0 1626880661518 5 connected

3.进入集群里面
/data # redis-cli -c

4.测试
127.0.0.1:6379> set a b   =======172.38.0.13:6379
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

5.停止redis3服务
[root@net ~]# docker stop bd528c98e84a
bd528c98e84a

6.再次查看a已经被13的从节点14代替工作   ====172.38.0.14:6379
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

172.38.0.14:6379> CLUSTER NODES
8ba10596bee2dda06c454faaeb8f257edb817107 172.38.0.15:6379@16379 slave 81bb5a1dfc466a1353858303f2aebf562a9d08cd 0 1626881652622 5 connected
47a8cf9598a44434ed6ea29d7272997b8b112ab6 172.38.0.14:6379@16379 myself,master - 0 1626881651000 7 connected 10923-16383
81bb5a1dfc466a1353858303f2aebf562a9d08cd 172.38.0.11:6379@16379 master - 0 1626881651603 1 connected 0-5460
fb2f55a1fb47b5523b520ef506ff1d795bb20ee6 172.38.0.13:6379@16379 master,fail - 1626880882055 1626880880435 3 connected
9fe62dbe3cef536a242dcfd1bc3f6bc3f782ef1e 172.38.0.16:6379@16379 slave 49d9df7e62b76a591739f03a53893ce038702603 0 1626881652000 6 connected
49d9df7e62b76a591739f03a53893ce038702603 172.38.0.12:6379@16379 master - 0 1626881651603 2 connected 5461-10922

从节点代替工作

学到这里已经足够用了!

补充:

docker名词介绍:
在这里插入图片描述

在这里插入图片描述

企业级:

docker compose

docker swarm

cicd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值