Docker系列4:Docker网络虚拟化基础-创新互联

一、网络虚拟化技术介绍

成都创新互联-专业网站定制、快速模板网站建设、高性价比环翠网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式环翠网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖环翠地区。费用合理售后完善,10余年实体公司更值得信赖。

1、什么是虚拟化网络

虚拟化网络即由linux内核所虚拟出来的网络,事实上,linux内核可模拟多种网络设备

  • 可模拟网线设备:模拟的网线设备是成对出现的,一个可用在容器内,一端用在交换机内

  • 可模拟交换机:容器接在这个交换机上,如果IP在同一网段,就可以实现互相通信,如下

Docker系列4:Docker网络虚拟化基础

网络虚拟化的解决方案有很多,例如:

  • OVS

  • SDN

在物理机上可以有多个虚拟交换机,容器可以分别接在不同的虚拟交换机上,如果两个虚拟交换机不在同一个网段,那么如何进行通信呢?

Docker系列4:Docker网络虚拟化基础 

此时需要进行转发

Docker系列4:Docker网络虚拟化基础

  • 可借助于内核转发

  • 也可以借助于iptables转发

2、如何实现两个物理机上的容器怎么通信?

方法1:是桥接模式(比如vmware的桥接)

  • 桥接模式情况下,物理网卡会作为交换机来使用的

  • 所有虚拟机都接入到这个物理网卡所模拟的交换机

  • 然后在模拟出来一个网卡给物理机使用,这个模拟的网卡也接入到交换机上

Docker系列4:Docker网络虚拟化基础

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

  • 如果是vm1,就将这个数据包转发到vm1

  • 如果是物理机自己的mac地址,那就就将这个报文转发给内部虚拟的网卡

  • 不同主机上的容器,可以用桥接的方式来实现通信,就是将物理网卡作为交换机

Docker系列4:Docker网络虚拟化基础

注意:

  • 桥接模式,代价是很大的,尤其在一个大规模部署的场景中,这样做的结果就一定会导致网络中的主机过多,导致风暴。

方法2:NAT模式

  • 在nat模式场景下,每个容器都还是接入在一个虚拟交换机,并且容器的网关需要指向这个交换机的地址,

  • 当容器产生数据包的时候,这个数据就会发送到虚拟机换机上

  • 虚拟交换机是由内核模拟的是,所以这个数据包会被内核收到

  • 内核就会检查发现目标主机是不是自己,如果不是自己,那么就会将这个数据包从网卡发送出去,这样就完成了数据的发送。

Docker系列4:Docker网络虚拟化基础

注意:此时的问题问题是虽然能将数据发送出去,但是回不来

  • 因为C所发送出去的数据包的源地址是C1,而这个地址被交换机隐藏起来的是,网络中的其他主机是找不到这个地址的,所以,回不来。

  • 如果想让数据可以正常的回复,就需要在H1主机上,在发送数据包的时候,将数据包的源地址修改成H1主机的地址,同时记录下来这个转发规则。

  • 这样,当回复数据的时候,只需要将数据回复给H1主机,H1主机通过检查地址转换表,就知道了需要将这个数据包转发给C1了。

以上两种方式都存在各自的问题

  • 桥接方式:容器需要直接暴露在网络中,容器太多的时候,容器形成风暴

  • NAT方式:容器基于nat进行通信,而且需要进行两次地址转换,效率太低

方法3:叠加网络(Overlay network),这种网络是基于隧道模式实现的

  • 隧道模式下,也需要模拟一个交换机,而且容器也是接在交换机上,如下图

Docker系列4:Docker网络虚拟化基础

  • 此时在进行数据发送的时候,不会修改数据包的源IP 源mac,而是在会原来数据包的基础上再封装一层ip和mac

二、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就是桥接模式

  • 这个桥并不是物理网卡的桥,而是创建了一个纯软件的交换机叫做docker0

  • 可以用ip addr或者ip link show看到

[root@host1 ~]# ip addr 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000   ... 2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000   ... 3: ens37:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000   ... 4: docker0:  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:  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:  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:  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:  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:  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:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000  ... 2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  ... 3: ens37:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  ... 4: docker0:  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:  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
  • 这个 veth7c1728b@if5 其实就是所生成的一对网卡中,连接到docker0网桥上的那一部分

  • 也就是可以理解三个容器将网线插入到了交换机上

  • 网卡中 @ 前面的部分是接入到虚拟机交换机中的部分

  • 网卡中 @ 后面的部分是容器的部分了

在容器中看一下网卡信息

/ # 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的客户端来源有三种

  • 宿主机:例如在宿主机上访问容器中的网站

  • 同一宿主机上的其他容器:两个容器接在同一个物理机的同一个交换机上,必然可以通信

  • 其他宿主机或者其他宿主机上的容器:这种情况下需要通过nat方式或者叠加网络的方式通信

3、host模式

一个容器中要隔离6类名称空间

  • user

  • mount

  • pid

  • uts

  • net

  • ipc

思考:有三个容器,这个三个容器只隔离三个名称空间 user mount pid,而另外三个是容器共享的,会是什么现象,如下图

Docker系列4:Docker网络虚拟化基础

  • 此时,各个容器有自己文件系统、用户信息和进程信息,并且是互不干扰的

  • 但是多个容器的主机名、网卡、协议栈是共享的,也就是主机名、地址都是相同的

  • 这样一来,一个容器访问另一个容器的上的资源的时候,直接用12.0.0.1就可以了

  • 比如一个容器安装的apache,一个安装了mysql,一个安装了php,那么这三个主机互相通信,就完全可以基于127地址来完成,因为他们用的是同一个协议栈。

让容器共享物理机的名称空间

  • 容器共享物理机的网卡名称空间,这样的话就是如果在容器中修改网卡,那么就会修改物理机的网卡的。

  • 这种模式就是docker 网络中的第二类:host,也就是让容器使用宿主机的网络名称空间

4、NULL模式

  • docker 网络中的第三类:null

  • 如果一个容器的的网络设置成null网络,那么也就是说这个容器是没有网络,有的时候需要创建一个容器不需要和外部主机通信,那么就可以用这种方式。

5、容器模型分类示意图

Docker系列4:Docker网络虚拟化基础

  • 关闭模型容器(closed)

  • 桥解模型容器(bridged),这个桥是nat桥,不是物理桥,而且该模式是默认模式

  • 联盟模型容器(joined)

  • 开放模型容器(open)

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": "",         ...         ...         ...

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章标题:Docker系列4:Docker网络虚拟化基础-创新互联
网页地址:http://hbruida.cn/article/coedpj.html