048、跨主机网络概述(2019-03-13 周三)
前面已经学习了Docker的几种网络方案:none、host、bridge和joined容器,他们解决了单个DockerHost内容器通信的问题。这里我们要学的是跨主机容器间通信的方案
跨主机网络方案包括:
1、docker原生的overlay和macvlan
2、第三方方案:flannel、weave、calico
docker网络是一个非常活跃的技术领域,不断有新的方案开发出来,那么这么多方案是如何与docker集成在一起的呢? libnetwork 以及 CNM
libnetwork & CNM
libnetwork 是docker容器网络库,最核心的内容是其定义的Container Network Model(CNM)。这个模型对容器网络进行了抽象,有以下三类组件组成:
1、Sandbox
Sandbox是容器的网络栈,包含容器的interface、路由表和DNS设置。Linux Network Namespace 是Sandbox的标准实现。Sandbox可以包含来自不同Network的Endpoint
2、Endpoint
Endpoint的作用是将Sandbox接入Network。Endpoint的典型实现是veth pair 。后面我们会举例,一个Endpoint只能属于一个 网络,也只能属于一个Sandbox。
3、Network
Network 包含一组 Endpoint,同一Network的Endpoint可以直接通信。Network的实现可以是Linux Bridge、VLAN等
下面是CNM的示例,Sandbox、Endpoint、Network都标记出来了
libnetwork CNM 定义了docker容器的网络模型,按照该模型开发出的dirver就能与docker daemon协同工作,实现容器网络。docker原生的driver包括 none、bridge、overlay和macvlan,第三方的driver包括flannel、weave、calico等
下面我们以docker bridge driver为例讨论 libnetwork CNM是如何实现的
1、两个Network:默认网络bridge和自定义网络 my_net2 。实现方式是 linux Bridge : docker0 和 br-5d863e9f78b6
2、三个Endpoint,由veth pair 实现,一端(vethxxx)挂在Linux Bridge上,另一端(eth0)挂在容器内
3、三个Sandbox,由Network Namespace实现,每个容器有自己的Sandbox