在云计算架构设计中,最复杂且最重要的组件就是网络,Docker作为云计算追捧的新宠儿也不会例外,尤其是当使用Docker容器构建分布式服务时,通信和网络变得非常重要。
开篇之前,先给读者分享下笔者对容器知识总结: 容器技术架构、网络和生态详解,内容涉及容器技术的方方面面,感兴趣的读者可通文末“阅读原文”过了解详情。
第1章 容器演进和关键技术介绍 4
第2章 为什么是Docker引领主流 13
第3章 详谈Docker的生态系统 34
3.1 Docker的生态系统导图 35
3.2 Docker的挑战者Rocket 37
第4章 详解Docker AUFS技术 38
第5章 Docker技术架构详细分析 44
5.1 Docker关键技术回顾 44
5.2 Docker实现持续部署 45
5.3 Docker总架构图 46
5.3.1 Docker Client模块 48
5.3.2 Docker Daemon模块 49
5.3.3 Docker Server子模块 50
5.3.4 Engine子模块 52
5.3.5 Job任务子模块 52
5.3.6 Docker Registry模块 53
5.3.7 Graph模块 53
5.3.8 Driver模块 54
5.3.9 Libcontainer模块 58
5.3.10 Docker container模块 60
第6章 容器定义存储(CDS)技术分析 61
第7章 Portworx容器定义存储(CDS)详解 70
7.1 Portworx架构和原理 71
7.2 存储控制面 72
7.3 数据面访问 73
7.4 生命周期管理 74
7.5 Portworx应用场景 75
第8章 Diamanti容器融合存储基础架构 78
8.1 容器的内建基础架构 79
8.2 容器与其网络互联 80
8.3 容器的存储持久化 81
8.4 简化容器管理 81
8.5 集成流行的容器开源架构 82
8.6 Diamanti产品特点 83
第9章 Docker原生网络和实现原理 84
第10章 Openstack如何实现与容器对接 88
第11章 Docker网络技术方案详解 94
11.1 Libnetwork方案介绍 95
11.2 Pipework方案介绍 97
11.3 Socketplane方案介绍 98
11.4 Weave方案介绍 99
11.5 Flannel方案介绍 100
11.6 Tinc方案介绍 101
第12章 细说Docker发展和生态 102
12.1 Docker发展历程 102
12.2 Docker的推动者 103
12.3 Docker镜像仓库 103
12.4 Docker的生态环境 104
12.5 Docker的优势 104
12.6 Docker的跨平台特性 106
12.7 Docker容器云 106
12.8 Docker改名Moby浅析 107
接下来,我们将从Docker原生网络架构出发,讨论目前活跃的多种针对Docker提出的网络优化方案。
Docker的网络是基于Linux的网络命名空间和虚拟网络设备(特别是veth pair)来实现。在Docker中,网络接口默认都是虚拟的接口,可以充分发挥数据在不同Docker间或Docker与宿主机转发效率。这是因为Linux通过在内核中通过数据复制实现虚拟接口之间的数据转发,即发送接口的发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而无需通过外部物理网络设备进行交换。
Docker容器创建网络时,会在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通,形成一对虚拟网络接口,这样的一对接口叫做veth pair。
当Docker进程启动之后,它会配置一个叫docker0的虚拟网桥在宿主机上。这个网桥接口允许Docker去分配虚拟的子网给即将启动的容器。这个网桥在容器内的网络和宿主机网络之间将作为网络接口的主节点呈现。
当Docker容器启动后,创建一对虚拟接口,分别放到本地主机和新容器的命名空间中。本地宿主机一端的虚拟接口连接到默认的docker0网桥或指定网桥上,并具有一个以veth开头的唯一名字。容器一端的虚拟接口将放到新创建的容器中,并修改名字作为eth0,这个接口只在容器的命名空间可见。