容器界大事件:深度解析 containerd

美国时间12月14日,Docker公司宣布将containerdDocker Engine中分离,并捐赠到一个新的开源社区独立发展和运营,”一个工业标准的容器运行时,注重简单、 健壮性、可移植性”。containerd可以作为daemon程序运行在Linux和Windows上,管理机器上所有容器的生命周期。阿里云,AWS, Google,IBM和Microsoft作为初始成员,会为项目提供贡献和维护人员。

containerd对于很多人来还是很陌生,为什么Docker公司会大张旗鼓地宣布这个开源项目,并得到了业界巨大的反响。

实际上早在16年3月,Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。

containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。containerd以Daemon的形式运行在系统上,通过unix domain docket暴露很低层的gRPC API,上层系统可以通过这些API管理机器上的容器。每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。

 

20161216174443

 

这对于社区和整个Docker生态来说是一件好事。对于Docker社区的开发者来说,独立的containerd更简单清晰,基于containerd增加新特性也会比以前容易。

对于容器编排服务来说,运行时只需要使用containerd+runC,更加轻量,容易管理。而独立之后containerd的特性演进可以和Docker Engine分开,专注容器运行时管理,可以更稳定。在向后兼容上也可以做的更好,containerd第一个正式版本1.0 Release之后将提供一年的支持,包括安全更新和Bugfix,而每次升级也会向后兼容一个小版本。

Docker为了表示对于社区和生态的诚意,特意强调了containerd中立的地位,符合各方利益。可以预见containerd将成为Docker平台的一块重要组件。阿里云, AWS, Google,IBM和Microsoft将参与到containerd的开发中。

为了让大家更好的理解containerd的功能和架构,下面我们从更细节的角度看看containerd。

架构

 

20161216174508

 

这里是containerd的架构图。中间这一层里包含了三个子系统,从这里可以看出containerd支持哪些能力:

  • Distribution: 和Docker Registry打交道,拉取镜像
  • Bundle: 管理本地磁盘上面镜像的子系统。
  • Runtime:创建容器、管理容器的子系统。

可以看出containerd非常的干净,提供的都是运行时真正需要的功能。

特性和路线图

  • 支持OCI镜像
  • 支持OCI运行时(runC)
  • 支持镜像的pull/push操作
  • 容器运行时和生命周期管理
  • 网络原语:创建/修改/删除接口
  • 让容器加入已有的Network Namespace
  • 使用“内容可寻址”存储支持全局镜像多租户共享

containerd当前版本是0.2.4,是从Docker Engine剥离的一个功能子集。当功能覆盖前面的特性列表时,containerd版本更新到1.0,之后会保证API的稳定性,并提供1年的LTS.

containerd和Docker Engine之间的关系

Docker Engine包含containerd,containerd专注于运行时的容器管理,而Docker除了容器管理之外还可以完成镜像构建之类的功能。

containerd提供的API偏底层,不是给普通用户直接用的。对于普通用户来说,可以继续使用Docker。容器编排系统的开发者才需要containerd,比如阿里云容器服务团队。

containerd,OCI和runC之间的关系

OCI是一个标准化的容器规范,包括运行时规范和镜像规范。runC是基于这个规范的一个参考实现,Docker贡献了runC的主要的代码。

从技术栈上,containerd比runC的层次更高,containerd可以使用runC启动容器,还可以下载镜像,管理网络。

containerd和容器编排系统的关系

从下图可以看出containerd在容器技术生态中的位置。对开源编排系统,Kubernetes现在直接使用Docker,将来的版本可以转而使用containerd。Mesos和其他的编排引擎也可以使用containerd而不是直接用Docker。

对云计算开发商,也可以非常方便地基于containerd提供定制化的容器网络、容器存储和编排方案。

 

20161216174518

 

总结

containerd目标是提供一个更加开放、稳定的容器运行基础设施。一方面最终客户将受益于一个稳定和良好支持的容器基础设施。另一方面,各家厂商可以利用containerd作为一个标准化、灵活的容器操作层,可以非常方便地提供定制化的网络、存储和容器编排。这对构建一个开放和健康的容器生态具有重要意义。

阿里云作为成员之一会积极参与新的开源项目,把在容器方面的探索和积淀回馈到社区中,帮助国内客户利用容器技术提升IT能力实现业务创新。

分享到:更多 ()