网络虚拟化

Docker 的本地网络实现其实就是利用了 Linux 上的网络命名空间虚拟网络设备(特别是 veth pair)。

基本原理

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

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

网络创建过程

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

  1. 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中;

  2. 本地主机一端的虚拟接口连接到默认的 docker0 网桥或指定网桥上,并具有一个以 veth 开头的唯一名字,如 veth1234;

  3. 容器一端的虚拟接口将放到新创建的容器中,并修改名字作为 eth0。这个接口只在容器的命名空间可见;

  4. 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0(例如 172.17.0.2/16),并配置默认路由网关为 docker0 网卡的内部接口 docker0 的 IP 地址(例如 172.17.42.1/16)。

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

Last updated

Was this helpful?