一、网络虚拟化技术介绍
1、什么是虚拟化网络
虚拟化网络即由linux内核所虚拟出来的网络,事实上,linux内核可模拟多种网络设备

网络虚拟化的解决方案有很多,例如:
在物理机上可以有多个虚拟交换机,容器可以分别接在不同的虚拟交换机上,如果两个虚拟交换机不在同一个网段,那么如何进行通信呢?
此时需要进行转发

2、如何实现两个物理机上的容器怎么通信?
方法1:是桥接模式(比如vmware的桥接)

当有数据包过来的时候,物理机网络会判断目标mac

注意:
方法2:NAT模式
在nat模式场景下,每个容器都还是接入在一个虚拟交换机,并且容器的网关需要指向这个交换机的地址,
当容器产生数据包的时候,这个数据就会发送到虚拟机换机上
虚拟交换机是由内核模拟的是,所以这个数据包会被内核收到
内核就会检查发现目标主机是不是自己,如果不是自己,那么就会将这个数据包从网卡发送出去,这样就完成了数据的发送。

注意:此时的问题问题是虽然能将数据发送出去,但是回不来
因为C所发送出去的数据包的源地址是C1,而这个地址被交换机隐藏起来的是,网络中的其他主机是找不到这个地址的,所以,回不来。
如果想让数据可以正常的回复,就需要在H1主机上,在发送数据包的时候,将数据包的源地址修改成H1主机的地址,同时记录下来这个转发规则。
这样,当回复数据的时候,只需要将数据回复给H1主机,H1主机通过检查地址转换表,就知道了需要将这个数据包转发给C1了。
以上两种方式都存在各自的问题
方法3:叠加网络(Overlay network),这种网络是基于隧道模式实现的

二、Docker网络详解
1、Docker的三种网络
[root@host1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
591c75b7dbea bridge bridge local
386d8dc4beb8 host host local
eb7b7cf29f29 none null local
2、bridge就是桥接模式
[root@host1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a4:e8:44:11 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
[root@host1 ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:3f:bf:cf brd ff:ff:ff:ff:ff:ff
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:3f:bf:d9 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:a4:e8:44:11 brd ff:ff:ff:ff:ff:ff
6: veth7c1728b@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether 9a:be:3b:60:d7:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0
启动一个容器
[root@host1 ~]# docker run --rm --name vh2 -it busybox
/ #
此时物理机会多出一个网卡设备
[root@host1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:a4:e8:44:11 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:a4ff:fee8:4411/64 scope link
valid_lft forever preferred_lft forever
6: veth7c1728b@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 9a:be:3b:60:d7:2e brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::98be:3bff:fe60:d72e/64 scope link
valid_lft forever preferred_lft forever
在容器中看一下网卡信息
/ # ip addr
可以通过brctl开控制和查看物理机网卡和容器网卡的对应关系
[root@host1 ~]# yum install bridge-utils -y
[root@host1 ~]# brctl show
bridge namebridge idSTP enabledinterfaces
docker08000.0242a4e84411noveth7c1728b
其实在使用了Docker0网桥的时候,系统是会自动生成一个iptables规则的【POSTROUNTING规则】
[root@host1 ~]# iptables -L -n --line -t nat
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
num target prot opt source destination
1 RETURN all -- 0.0.0.0/0 0.0.0.0/0
docker的客户端来源有三种
3、host模式
一个容器中要隔离6类名称空间
思考:有三个容器,这个三个容器只隔离三个名称空间 user mount pid,而另外三个是容器共享的,会是什么现象,如下图

此时,各个容器有自己文件系统、用户信息和进程信息,并且是互不干扰的
但是多个容器的主机名、网卡、协议栈是共享的,也就是主机名、地址都是相同的
这样一来,一个容器访问另一个容器的上的资源的时候,直接用12.0.0.1就可以了
比如一个容器安装的apache,一个安装了mysql,一个安装了php,那么这三个主机互相通信,就完全可以基于127地址来完成,因为他们用的是同一个协议栈。
让容器共享物理机的名称空间
4、NULL模式
5、容器模型分类示意图

6、查看创建容器的时网络信息
查看一下 bridged 网络模型信息
[root@host1 ~]# docker network inspect bridge
...
...
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
...
...
...
"com.docker.network.bridge.name": "docker0",
...
查看容器的网络类型
[root@host1 ~]# docker container inspect vh2
...
...
...
"NetworkSettings": {
"Bridge": "",
...
...
...