跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

时间:2022-09-02 14:57:32

前面已经学习了 Docker 的几种网络方案:none、host、bridge 和 joined 容器,它们解决了单个 Docker Host 内容器通信的问题。本章的重点则是讨论跨主机容器间通信的方案。

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

跨主机网络方案包括:

  1. docker 原生的 overlay 和 macvlan。

  2. 第三方方案:常用的包括 flannel、weave 和 calico。

docker 网络是一个非常活跃的技术领域,不断有新的方案开发出来,那么要问个非常重要的问题了:

如此众多的方案是如何与 docker 集成在一起的?

答案是:libnetwork 以及 CNM。

libnetwork & CNM

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

Sandbox

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

Endpoint

Endpoint 的作用是将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair,后面我们会举例。一个 Endpoint 只能属于一个网络,也只能属于一个 Sandbox。

Network

Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等。

下面是 CNM 的示例:

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

如图所示两个容器,一个容器一个 Sandbox,每个 Sandbox 都有一个 Endpoint 连接到 Network 1,第二个 Sandbox 还有一个 Endpoint 将其接入 Network 2.

libnetwork CNM 定义了 docker 容器的网络模型,按照该模型开发出的 driver 就能与 docker daemon 协同工作,实现容器网络。docker 原生的 driver 包括 none、bridge、overlay 和 macvlan,第三方 driver 包括 flannel、weave、calico 等。

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

下面我们以 docker bridge driver 为例讨论 libnetwork CNM 是如何被实现的。

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

这是前面我们讨论过的一个容器环境:

  1. 两个 Network:默认网络 “bridge” 和自定义网络 “my_net2”。实现方式是 Linux Bridge:“docker0” 和 “br-5d863e9f78b6”。

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

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

接下来我们将详细讨论各种跨主机网络方案,首先学习 Overlay。

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)