本章学习内容:1、docker网络体系结构的基本原理,比如容器网络模型(CNM)以及Libnetwork。2、实际操作搭建网络。
Docker网络简介
Docker 容器内部运行的应用间需要交互依赖大量不同的网络,幸运的是,容器与容器之间、容器与外部网络 与VLAN(Virtual Local Area Network 虚拟局域网)之间的连接都有解决方案。
Docker网络架构源自一种容器网络模型(CNM)方案,此方案开源并支持插式连接。
- Libnetwork是Docker对CNM的一种实现模式,提供DOcker核心网络架构全部功能。
- 不同驱动可以通过插拔式接入Libnetwork,提供定制化的网络拓扑。
为了实现开箱即用的效果,Docker封装了本地驱动、覆盖了大部分常用网络需求。其中包括单机桥接网络、多机覆盖网络,并且支持介入现有VLAN。
Libnetwork提供了本地服务发现(类似NACOS)、容器负载均衡方案。
Docker详解
基础理论
顶层设计中,Docker网络架构由3部分构成:CNM、Libnetwork、驱动。
Libnetwork是CNM的具体实现、实现了CNM中列举的核心组件。
驱动通过特定网络拓扑方式拓展模型的能力。
CNM
Docker网络架构设计规范是CNM,CNM规定了Docker网络的基础组成要素。
CNM定义了3个基本要素:1、沙盒(Sandbox);2、终端(Endpoint);3、网络(Network)。
- 沙盒:是一个
独立的网络栈
。包括以太网接口、端口、路由表、DNS配置。 - 终端:虚拟网络接口。与普通网络接口一样,负责
创建连接
。在CNM中终端负责将沙盒连接到网络 - 网络:是802.1d网桥的软件实现。因此,网络就是需要交互的终端的集合,且终端之间相互独立。
组件连接如图:
网络组件关联、容器间通信原理:
容器A只有一个接口终端(虚拟网络接口,将沙盒连接到网络)连接到网络A、容器B、有两个接口终端分别接入网络A、网络B。因为两个容器都接入了网络A,故容器A、B可进行通信。但是如果没有三层路由器(根据IP进行转发数据)支持,容器B的两个终端之间不能进行通信。
终端类似常见的网络适配器,一个终端只能接入到某一个网络、如果容器需要接入到多个网络、则需要多个终端。
Libnetwork
CNM是设计规范文档、Libnetwork是标准的实现。Libnetwork是开源的、他跨平台被DOcker使用。
早期网络代码都存在与docker daemon中,为了符合OCI开放容器计划要求、以及小而专的代码哲学、后面将docker daemon中的模块进行拆分、Libnertwork这个外部类库就座位了docker daemon中的一个功能模块进行替代。
Libnetwork实现了CNM中定义的全部3各组件。另外还实现了本地服务发现、基于INgress的容器负载均衡(k8s中又出现)、网络控制层和管理层功能。
驱动
Libnetwork实现了控制层和管理层功能、驱动就负责实现数据层。
比如: 网络联通性和隔离性是由驱动来处理的。驱动层时机创建网络对象。关系如下图所示:
Docker封装了若干驱动、被称为原生驱动或者本地驱动。linux上包括Bridge、Overlay、Macvlan。第三方也可以编写Docker网络驱动、被称为远程驱动,例如Calico、Contiv等。
每个驱动都负责其上所有的网络资源的创建
和管理
----谁生谁养,比如,一个叫“prod-fe-cuda”的覆盖网络由Overlay驱动所有、并管理。则Overlay驱动会在创建、管理和删除“prod-fe-cuda”网络资源时被调用。
Libnetwork支持同时激活多个网络驱动,所以Docker支持庞大的异构体系。
单机桥接网络
最简单的docker网络。
- 单机:只能在单个docker主机上运行、并只能与所在Docker内的容器进行网络通信。
- 桥接意味着是802.1.d桥接的一种实现(二层交换机,也就是基于mac地址)。
Linux Docker 创建单机桥接网络采用内置桥接驱动。
Linux Docker主机之上 默认的“bridge”网络被映射到内核中为“docker0”的Linux网桥,通过命令查看
Docker默认“bridge”网络和Linux内核中的“docker0”网桥之间关系如下图:
在顶部补充了接入“bridge”网络的容器
。“bridge”网络在主机内核中映射名为“docker0”的Linux网桥。网桥可以通过主机以以太网接口的端口映射进行反相关联。(不要想bridge和docker0有什么物理上的联系,他们就是映射的关系。)
后面桥接实战部分就不进行讲解了。总结一下:
- 如果使用单机桥接网络,两个容器使用的桥接网络是同一个,那么两容器之前可相互通信,如果桥接的是不同的网络,如下图所示
c1和c2之间不能通信。
多机覆盖网络
特点:
- 适用于多机环境,允许单个网络包含多个主机,不同主机间通过链路层实现通信。
- 该方式是理想容器间通信的方式,支持完全容器化的应用,并具有伸缩性。
- 创建覆盖网络很简单,docker create network create --d overlay
加入现有网络,让容器化应用连接上局域网内未容器化应用
docker内置驱动Macvlan实现这一点,原理是为容器提供IP和MAC,实现效果如下图:
具体内容需要扎实的计算机网络基础,理解起来很难,所以先放一放。