Docker网络(一)

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

image.png

Docker支持的网络驱动

到目前为止,Libnetwork实现了五种驱动

  • brige: 最成熟,k8s默认使用
  • host: 无隔离性,安全风险高
  • null: 全部手动配置容器网络,最高的可配置性
  • remote: 网络插件的实现,多种SDN方案可用
  • overlay: 原生跨主机多子网网络方案,不太成熟
  • ipvlan: (new)
  • macvlan: (new)
  • windows: (new)

bridge

Docker设计的NAT网络模型

image.png

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/16172.17.0.3/16172.17.0.4/16172.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网络方案无法解决不同主机之间的容器的通信问题。

你可能感兴趣的:(Docker网络(一))