docker容器网络
1. 概述
Docker 的几种网络方案: none、host、bridge和joined,它们解决了单个 Docker Host内容器通信的问题。
跨主机网络方案包括:
(1)docker原生的overlay和macvlan
(2)第三方方案:常用的包括flannel、weave 和 calico。
docker 网络是一个非常活跃的技术领域,不断有新的方案开发出来,如此众多的方案是如何与 docker集成在一起的? 答案: libnetwork以及CNM。
1.1 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 等。
如图所示两个容器,一个容器一个Sandbox,每个Sandbox都有一个Endpoint 连接到Network1,第二个 Sandbox还有一个 Endpoint 将其接入 Network2。libnetworkCNM 定义了 docker 容器的网络模型,按照该模型开发出的 driver 就能与docker daemon 协同工作,实现容器网络。docker 原生的driver包括 none、bridge、overlay 和macvlan,第三方 driver包括flannel、weave、calico 等。
(1) 两个Network: 默认网络bridge和自定义网络my_net2。实现方式是 Linux Bridge: docker0 和 br-024ff4851920.
(2) 三个Endpoint,由veth pair 实现,一端(vethxxx)挂在 Linux Bridge 上,另一端(eth0)挂在容器内。
(3) 三个 Sandbox,由Network Namespace 实现,每个容器有自己的 Sanbox。