Docker的四种网络深入剖析(host模式、 container模式、 none模式、bridge模式)

Docker虚拟化技术底层是基于LXC+Cgroups+AUFS(Overlay)技术实现,而我们有熟知Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组(Process Groups)所使用的物理资源的机制。
Docker虚拟化的产物是Docker容器,基于Docker Engine启动容器时,默认会给容器指定和分配各种子系统:CPU子系统,、Memory子系统、IO子系统、NET子系统等。
启动一个容器,会分配Network Namespace(子系统)提供了一份独立的网络环境,包括网卡、路由、Iptables规则等,容器跟其他容器的Network Namespace是相互隔离的。

通过Docker run创建Docker容器时,可以使用–net选项指定Docker容器的网络模式,Docker默认有四种网络模式:
n host模式,使用–net=host指定;
n container模式,使用–net=container:NAME_or_ID指定;
n none模式,使用–net=none指定;
n bridge模式,使用–net=bridge指定,默认设置。
2. Host模式剖析
通常来讲,启动新的Docker容器,都会分配独立的Network Namespace隔离子系统,如果在运行是指定为host模式,那么Docker容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace子系统。
新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和宿主机共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。
3. Container模式剖析
Docker容器网络,Container模式是指定新创建的容器和已存在的某个容器共享一个Network Namespace子系统,而不是和宿主机共享Namespace子系统。
新创建的Docker容器不会创建自己的网卡,不会再虚拟出自己的网卡、IP、网关、路由等信息,而是和指定的Docker容器共享IP和端口等信息,其他的软件、目录还是相互独立的。两个容器除了网络方面相同之外,其他的如文件系统、进程列表等还是相互隔离的。如果依附的Docker容器关闭,新的Docker容器网络也会丢失。
4. None模式剖析
None模式与其他的模式都不同,如果Docker容器使用None模式,Docker容器会拥有自己的Network Namespace子系统,但是Docker引擎并不会为新启动的Docker容器配置任何的网络信息。
即新创建的Docker容器不会虚拟出自己的网卡、IP、网关、路由等信息,而是需要手工为Docker容器添加网卡、配置IP、路由等信息,在企业实战环境中,通常会使用Pipework工具为Docker容器指定IP等信息。
5. Bridge桥接剖析
Docker容器的Bridge模式也是Docker默认的网络模式,该模式会为每个容器分配Network Namespace子系统,会自动给每个容器虚拟出自己的网卡、IP、网关、路由等信息,无需手工添加。
默认创建的Docker容器会统一通过一对veth虚拟网卡,连接到一个虚拟网桥交换机Docker0上,所有的容器的网络加入到一个二层交换机网络里面,即同一宿主机的所有容器之间都是可以相互联通和访问的。
6. Bridge模式原理剖析
默认Docker引擎启动会在本地生成一个Docker0虚拟网卡。Docker0是一个标准Linux虚拟网桥设备。在Docker默认的桥接网络工作模式中,docker0网桥起到了至关重要的作用。物理网桥是标准的二层网络设备,标准物理网桥只有两个网口,可以将两个物理网络连接在一起。
但与物理层设备集线器等相比,网桥具备隔离冲突域的功能。网桥通过MAC地址学习和泛洪的方式实现二层相对高效的通信。随着技术的发展,标准网桥设备已经基本被淘汰了,替代网桥的是二层交换机。二层交换机也可以看成一个多口网桥。
如图为Docker容器采用Bridge模式结构图:
在这里插入图片描述
Docker Bridge桥接模式创建过程:
1)启动一个Docker容器,指定模式为桥接模式时,Docker引擎会创建一对虚拟网卡veth pair设备,veth设备总是成对出现的,组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来,veth设备常用来连接两个网络设备,可以把 veth 接口对认为是虚拟网线的两端。这个虚拟网线一端插在名为 docker0 的网桥上,另一端插到容器里。通过把每个 veth 接口绑定到 docker0 网桥,Docker 创建了一个虚拟子网,这个子网由宿主机和所有的 Docker 容器共享。
2)Docker将veth pair设备的一块设备放在新创建的容器中,命名为eth0,然后将另外一块设备放在宿主机中,以vethxxx类似的名称命名,并将这个网络设备加入到docker0网桥中。
3)Docker引擎会从docker0子网中动态分配一个新的IP给容器使用,并设置docker0的IP地址为容器的默认网关。
4) 此时新创建的容器与宿主机能够通信,宿主机也可以访问容器中的IP地址,在Bridge模式下,连在同一网桥(交换机)上的容器之间可以相互通信,同时容器也可以访问外网(基于iptables SNAT),但是其他物理机不能访问docker容器IP,需要通过NAT将容器IP的port映射为宿主机的IP和port。

发布了52 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/HCY_2315/article/details/103927400