libnetwork提出了新的容器模型,定义了标准的API用于为容器配置网络,其底层可以适配各种网络驱动

Docker支持的网络驱动
到目前为止,Libnetwork实现了五种驱动
-
brige:
最成熟,k8s默认使用 -
host:
无隔离性,安全风险高 -
null:
全部手动配置容器网络,最高的可配置性 -
remote:
网络插件的实现,多种SDN方案可用 -
overlay:
原生跨主机多子网网络方案,不太成熟 -
ipvlan:
(new) -
macvlan:
(new) -
windows:
(new)
bridge
Docker设计的NAT网络模型

Docker daemon启动时会再主机创建一个Linux网桥(默认为docker0,可通过-b 参数手动指定)。容器启动时,Docker会创建一堆veth pair(虚拟网络接口)设备,veth设备的特点是成对存在,从一端进入的数据会同时出现在另一端。Docker会将一端挂载到docker0网桥上,另一端放入容器的Network Namespace内,从而实现容器与主机通信的目的。
在网桥模式下,Docker容器与internet的通信,以及不同的容器之间的通信,都是通过iptables控制的。
总之,Docker网络的初始化动作包括:创建docker0网桥、为docker0网桥新建子网以及路由,创建相应的iptables规则等。
网络实验
首先启动4个容器
[root@localhost ~]# docker run -itd ubuntu /bin/bash
c9e91bc9f18af328539207472245e1b7a44b7f474850ce083ca9e322dd0a70e7
[root@localhost ~]# docker run -itd ubuntu /bin/bash
84a23e6357e553c34863869423e6c475cf597502f3ff947135d40df5a3a9ae32
[root@localhost ~]# docker run -itd ubuntu /bin/bash
a96b6959639dea7a605e7662b37d027ae1fba32ad22c51bba5b62fc1c0f54845
[root@localhost ~]# docker run -itd ubuntu /bin/bash
f886a3841bf477b8bcb23d157873a5236e7a8536b9bcda27bca63b06db79bd6
查看主机的网桥信息
[root@localhost ~]# brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0242f0d7fe90 no veth12dcc90
veth7245690
veth9c0f097
vethd78b62c
可以查看,四个容器的IP分别是172.17.0.2/16
、172.17.0.3/16
、172.17.0.4/16
、172.17.0.5/16
,同时,这四个容器之间是可以互相通信的
删除所有容器
[root@localhost ~]# docker rm -f `docker ps -aq`
f886a3841bf4
a96b6959639d
84a23e6357e5
c9e91bc9f18a
再次查看主机的网桥信息
[root@localhost ~]# brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0242f0d7fe90 no
当容器被删除后,docker会同时删除相关联的虚拟网络接口。
同时,也可以看出,bridge网络方案无法解决不同主机之间的容器的通信问题。
网友评论