Docker 网络虚拟化

Dock町的本地网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 veth pair ) 。 熟悉这两部分的基本概念有助于理解 Docker 网络的实现过程 。

基本原理

直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包;此外,如果不同子网之间要进行通信,还需要额外的路由机制 。

Docker 中的网络接口默认都是虚拟接口 。 虚拟接口的最大优势就是转发效率极高 。 这是因为 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口的发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而无须通过外部物理网络设备进行交换。 对于本地系统和容器内系统来看,虚拟接口跟一个正常的以太网卡相比并无区别,只是它的速度要快得多 。

Docker 容器网络就很好地利用了 Linux 虚拟网络技术,它在本地主机和容器内分别创建一个虚拟接口 veth , 并连通(这样的一对虚拟接口 叫做 veth pair)。

Docker 网络虚拟化_第1张图片

网络创建过程

一般情况下, Docker 创建一个容器的时候,会具体执行如下操作 :

1 ) 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中;
2 )本地主机 一端的虚拟接口连接到默认的 docker0 网桥或指定网桥上,并具有一个以veth 开头的唯一名字,如 veth1234;
3 )容器一端的虚拟接口将放到新创建的容器中,并修改名字作为 ethO 。 这个接口只在容器的命名空间可见;
4 )从网桥可用地址段中获取一个空闲地址分配给容器的 eth0 (例如 172.17.0.2/16 ),并配置默认路由网关为 docker0 网卡的内部接口 docker0 的 IP 地址(例如 172.17.42.1/16 ) 。

完成这些之后,容器就可以使用它所能看到的 eth0 虚拟网卡来连接其他容器和访问外部网络 。

用户也可以通过 docker network 命令来手动管理网络。

在使用 docker [container] run 命令启动容器的时候,可以通过--net 参数来指定容器的网络配置 。 有 5 个可选值 bridge 、none 、 container 、 host 和用户定义的网络:

Docker 网络虚拟化_第2张图片

 手动配置网络

用户使用 --net=none 后, Docker 将不对容器网络进行配置 。 下面,介绍手动完成配置网络的整个过程 。 通过这个过程,可以了解到 Docker 配置网络的更多细节 。

首先,启动一个 ubuntu: 16.04 容器,指--net=none 参数:

Docker 网络虚拟化_第3张图片

Docker 网络虚拟化_第4张图片

当容器终止后, Docker 会清空容器,容器内的网络接口会随网络命名空间一起被清除,A 接口也被自动从 docker0 卸载并清除 。 此外,在删除 /var/run/netns/ 下的内容之前,用户可以使用 ip netns exec 命令在指定网络命名空间中进行配置, 从而更新容器内的网络配置。

 

 

 

 

你可能感兴趣的:(Docker)