美国时间12月14日,Docker公司宣布将containerd从Docker 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规范的容器都可以支持。
这对于社区和整个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。
架构
这里是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提供定制化的容器网络、容器存储和编排方案。
总结
containerd目标是提供一个更加开放、稳定的容器运行基础设施。一方面最终客户将受益于一个稳定和良好支持的容器基础设施。另一方面,各家厂商可以利用containerd作为一个标准化、灵活的容器操作层,可以非常方便地提供定制化的网络、存储和容器编排。这对构建一个开放和健康的容器生态具有重要意义。
阿里云作为成员之一会积极参与新的开源项目,把在容器方面的探索和积淀回馈到社区中,帮助国内客户利用容器技术提升IT能力实现业务创新。
想了解更多阿里云容器服务内容,请访问 https://www.aliyun.com/product/containerservicearchitecture.png
附Docker官方新闻稿https://www.docker.com/docker-news-and-press/docker-extracts-and-donates-containerd-its-core-container-runtime-accelerate