手把手教你实现Docker部署Redis集群( 二 )


Linux为了支持越来越多的网卡以及虚拟设备 , 所以使用网桥去提供这些设备之间转发数据的二层设备 。 Linux内核支持网口的桥接(以太网接口) , 这与单纯的交换机还是不太一样 , 交换机仅仅是一个二层设备 , 对于接受到的报文 , 要么转发 , 要么丢弃 。 运行着Linux内核的机器本身就是一台主机 , 有可能是网络报文的目的地 , 其收到的报文要么转发 , 要么丢弃 , 还可能被送到网络协议的网络层 , 从而被自己主机本身的协议栈消化 , 所以我们可以把网桥看作一个二层设备 , 也可以看做是一个三层设备 。
Linux中Bridge实现Linux内核是通过一个虚拟的网桥设备(Net Device)来实现桥接的 。 这个虚拟设备可以绑定若干个以太网接口 , 从而将它们连接起来 。 Net Device网桥和普通的设备不同 , 最明显的是它还可以有一个ip地址 。
手把手教你实现Docker部署Redis集群文章插图
如上图所示 , 网桥设备br0绑定的eth0和eth1 。 对于网络协议栈的上层来说 , 只看到br0 。 因为桥接是在数据链路层实现的 , 上层不需要关心桥接的细节 , 于是协议栈上层需要发送的报文被送到br0 , 网桥设备的处理代码判断报文被转发到eth0还是eth1 , 或者两者皆转发 。 反之 , 从eth0或者从eth1接收到的报文被提交给网桥的处理代码 , 在这里判断报文应该被转发、丢弃或者提交到协议栈上层 。
而有时eth0、eth1也可能会作为报文的源地址或目的地址 , 直接参与报文的发送和接收 , 从而绕过网桥 。
Bridge常用操作Docker自动完成了对网桥的创建和维护 。 如果想要进一步理解网桥 , 可以看下如下举的一些常用操作命令 。
新增一个网桥:
brctl addbr xxxxx在新增网桥的基础上增加网口 , 在linux中 , 一个网口其实就是一个物理网卡 。 将物理网卡和网桥连接起来:
brctl addif xxxx ethx网桥的物理网卡作为一个网口 , 由于在链路层工作 , 就不再需要IP地址了 , 这样上面的IP地址自然失效:
ipconfig ethx 0.0.0.0给网桥配置一个IP地址:
ipconfig brxxx xxx.xxx.xxx.xxx这样网桥就是一个有了IP地址 , 而连接在这之上的网卡就是一个纯链路层设备了 。
Veth Pair上文说到 , docker在宿主机上创建docker0网桥后 , 凡是连接到docker0上的网桥 , 就可以用它来通信 。 那么这里又有个问题 , 就是这些容器是如何连接到docker0网桥上的?所以这就是Veth Pair虚拟设备的作用了 , Veth Pair就是为了在不同的Network Namespace之间进行通信 , 利用它 , 可以将两个Network Namespace连接起来 。
Veth Pair设备的特点是:它被创建出来后 , 总是以两张虚拟网卡(Veth Peer)的形式出现 。 并且 , 其中一个网卡发出的数据包 , 可以直接出现在另一张“网卡”上 , 哪怕这两张网卡在不同的Network Namespace中 。
正是因为这样的特点 , Veth Pair成对出现 , 很像是一对以太网卡 , 常常被看做是不同Network Namespace直连的“网线” 。 在Veth一端发送数据时 , 他会将数据发送到另一端并触发另一端的接收操作 。 我们可以把Veth Pair其中一端看做另一端的一个Peer 。
手把手教你实现Docker部署Redis集群文章插图
Veth Pair操作命令创建Veth Pair:
ip link add veth0 type veth peer name veth1创建后查看Veth Pair的信息:
ip link show将其中一个Veth Peer设置到另一个Namespace:
ip link set veth1 netns netns1在netns1中查看veth1设备: