一、研究背景及意义(附参考文献,不少于800字)

  1. Docker技术可谓是近年最火热的技术之一,铺天盖地的技术论坛和各种讲座,大家都在分享关于如何容器化以及如何使用Docker优化自己运维和开发流程的经验。随着Docker技术的逐渐普及,使用Docker已经不再是一个难题,现在更重要的是生产环境容器化的最佳时间,另外就是容器编排引擎之争。但是对于技术人员来说,除去Docker外表的繁华,什么是容器,容器到底是怎么创建,容器底层的技术探秘也是非常重要的。<br /> 如果有人问“Docker技术到底是怎么实现的呢?”,大多数人只能粗浅地说“Docker是使用Linux KernelNamespaceCgroups实现的一种内核级别的虚拟化技术”。那么,什么是NamespaceCgroupsDocker是怎么使用它们的,容器到底是怎么一步步地被创建出来的,这些问题也是非常重要的,它们是整个容器技术的基石,掌握了这些基石才能更加容易地向上攀登。<br /> 在容器运行时之外,镜像服务与联合文件系统也是Docker流行的最为关键的一点。Docker镜像的标准化使得“Build once,Run anywhere”成为了事实。只要Linux内核版本满足基本要求,即可运行任意容器,并且Docker镜像体积大大减小。而这背后,是联合文件系统(Union File System)的支持,它使得镜像分层成为可能,并且可以将rootfs分为只读层和读写层,在容器运行完毕后后读写层自行销毁,对rootfs毫无修改。<br /> 除了Docker底层实现原理外,Docker上层也在不断地进行架构演进,目前已经进行了层次拆分,从最底层的容器运行时OCI(Open Container Initialitive)实现(如runC——oci参考实现,runV——基于虚拟化技术的oci实现),到上层的为容器编排引擎服务的CRI(Container Runtime Interface)实现(如Docker——主流容器运行时,cri-o——为Kubernetes实现的轻量级容器运行时)。容器运行时由此可分为oci-runtimecri-runtime。<br /> CRI抽象可以使容器编排引擎(如Kubernetes)摆脱对cri-runtime实现的依赖,OCI抽象可以使cri-runtime摆脱对oci-runtime的实现依赖。<br /> 学习Docker的实现原理可以让我们对容器底层有更为深入的了解,更好的拥抱云原生时代;学习Docker的架构演进可以让我们对容器与容器编排认识更为深刻,为云计算、Serverless等基于容器的上层开发积累技术底蕴。

二、国内外研究现状(文献综述,附参考文献,不少于1000字)

  1. Docker官方如此描述Docker:“Build, Ship, Run.An open platform for distributed applications for developers and sysadmins”。DockerLinux内核出发,属于轻量级虚拟化技术,可以在秒级提供应用隔离环境,完成云计算时代分布式应用的第一需求“隔离”。另外,Docker的镜像技术利用联合文件系统的又是,自下至上地打包系统软件、系统环境以及软件程序,将运行环境与应用程序灵活地结合,快速运行Docker化的应用程序。同时, 可读性极强的Dockerfile,极大地简化镜像的复杂性,并为镜像的转移与重新构建提供了可能性。<br /> 容器技术已经流行多年,市面上有着较多的从源码角度分析Docker实现原理的书籍。<br /> Docker源码分析》是来自DaoCloud的孙宏亮所著的,对Docker源码进行深度解析的一本书。该书内容主要集中于三个部分:Docker架构、Docker模块以及Docker的三驾马车SwarmMachine以及Compose。第一部分主要从宏观的角度领略Docker的架构设计,并初步介绍架构中的各模块的职责;第二部分是对Docker ClientDocker DaemonDocker ServerDocker网络、Docker镜像、Docker容器等重要的模块进行介绍;第三部分介绍Docker的生态,三驾马车可以很好地补充Docker的跨主机能力以及部署能力。<br /> Docker容器与容器云》是浙江大学SEL实验室所著的,对Docker以及Kubernetes源码进行深度解析的一本书。Docer部分的话讲解了Docker容器的核心原理和实践技巧。此书首先深入分析了容器的namespacecgroups原理,紧接着以docker run命令为线索,一路贯穿Docker的容器创建、镜像组织、联合文件系统以及容器网络初始化的源码,透彻地展示了从一条指令到最终容器生成的整个过程中,Docker源码的设计原理和执行路线。另外在第二版中添加了容器的架构解耦内容,Docker逐步发展成容器运行时(runtime)、镜像构建(builder)、镜像分发(distribution)、网络(networking)、数据卷(volumn)等独立的功能组件,提供daemon来管理,并提供Engine暴露一组标准的API来操作这些组件;在网络实现方面,Docker将网络相关的实现解耦为独立的组件libnetwork,抽象出一个通用的容器网络模型(CNM),功能上也原生支持了跨主机通信;修改Docker Engine来直接调用runC的二进制文件为Docker提供容器引擎。<br /> 《自己动手写Docker》是阿里云容器服务团队所著的,以一个简化版的Docker实现来讲解Docker原理的一本书。此书认为单单讲解底层的技术实现细节和源码解读是一件很枯燥的一件事,囫囵吞枣地过一遍技术细节作用不大,而一步步地用自己的代码去实现它更富有趣味性,进一步打开进入容器技术社区的大门。此书的内容有以下内容:“容器与开发语言”,介绍Docker的基本功能与特点;“基础技术”,介绍了NamespaceCgroupsUnion File System等实现容器的基础技术;“构造容器”,构造一个最简单的容器环境;“构造镜像”,使用分层文件系统,构造一个简单的容器镜像;“构造容器进阶”,更加贴实真实的容器实现,将各种技术整合在一起去实现容器整体功能;“容器网络”,实现容器与容器之间、容器与宿主机之间的网络通信;“高级实践”,使用自己编写的容器,运行一些通用程序,验证容器的可用性,此外还介绍了runC的一些概况与原理解析。

三、主要研究或解决的问题和拟采用的方法

希望自底向上地手写一个Docker容器,主要分为三步:
1、设计和实现一个符合OCI标准的容器运行时,即简化版的runC。包含容器运行时实现与一个CLI工具。命名为capsule。
2、设计和实现一个具有镜像管理和网络管理的容器,即简化版的dockerd。包含一个容器daemon和一个CLI工具。命名为capsule-daemon。
3、设计和实现一个在容器daemon基础上的Kubernetes CRI Plugin,将Kubernetes底层依赖由Docker替换为capsule-daemon。命名为capsule-cri-plugin。

检测实现的完成度的标准是基于手写的容器可以正常运行一个MySQL+Redis+Spring Boot的WebServer(命名为capsule-demo-app),在实现CRI plugin后,可以在Kubernetes中运行capsule-demo-app。

四、工作进度计划

3月16日~3月29日,实现第一步,将capsule开发完毕;
3月30日~4月12日,实现第二步,将capsule-daemon开发完毕;实现第三步,将capsule-cri-plugin开发完毕(视前面进度而定,进度不足将放弃这一步);
4月13日~4月26日,搭建论文组织结构,完成论文初稿;整合论文章节,论文补充、优化与调整。
4月27日~5月10日,论文润色,格式调整,正式定稿。