libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model(CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:

    Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。Linux Network Namespace 是 Sandbox 的标准实现。Sandbox 可以包含来自不同 Network 的 Endpoint 。

    Endpoint 将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair,一个Endpoint 只能属于一个网络,也只能属于一个 Sandbox。

    Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等。image.png
    libnetwork CNM 定义了 docker 容器的网络模型,按照该模型开发出的 driver 就能与 docker daemon 协同工作,实现容器网络。docker 原生的 driver 包括 none、bridge、overlay 和 macvlan,第三方 driver 包括 flannel、weave、calico 等。image.png
    使用之前的例子:
    image.png
    (1)两个 Network:默认网络 bridge 和自定义网络 my_net2 。实现方式是 Linux Bridge:docker0 和 br-5d863e9f78b6。

    (2)三个 Endpoint ,由 veth pair 实现,一端(vethxxx)挂在 Linux Bridge 上,另一端(eth0)挂在容器内。

    (3)三个 Sandbox ,由 Network Namespace 实现,每个容器有自己的 Sanbox。