[云原生容器技术] docker和containerd的关系

125 阅读4分钟

前言

云原生的容器技术,涉及到很多的历史问题,很多人在刚刚解除的时候都是一团乱麻,docker containerd runc cri 等等概念搅得人头痛,在本文中详细解释了云原生容器技术间的关系还有一些发展过程。 注意:本文涉及到了一些本人的个人观点,非常片面,如果冒犯到任何人提前讲抱歉。 云原生容器技术的关系可以如下图所示:

container.png

一、 从docker 开始

docker 和容器的概念是我在大学时的实验室中听老师讲到的,在那个稚嫩的时间段中一度将两者当作同一个东西,docker 就是容器的代名词。虽然现在看来是很明显的错误,但从侧面也能看到docker的影响力。

在docker 大火的那段时间中,docker 凭借着容器镜像这个大杀招疯狂攻城略地,相信使用过的朋友应该都知道它的便利,其他容器厂商被压得抬不起头。这时谷歌希望能和docker联合开发一个容器运行时但是当时正在风头上的docker 拒绝了。在我看来这也是在现在云原生环境中docker 逐渐落入下风的伏笔

二、从libcontainer 到runc

后来docker 公司将自己的容器管理工具libcontainer捐献给OCI(Open Conainer Intiative) 然后被更名为runc,libcontainer是docker 基于LXC容器管理引擎。libcontainer 主要包含如下功能:

  • namespace 容器技术的基础,包括mount、network 、uts 等namespace 的创建和初始化
  • cgroup linux 内核的特性,可以对进程的资源(包括device 、memory、cpu)进行管理限制和隔离
  • network 实现docker 的几种网络模式,后面我会专门出一片文章来写
  • volume 文件系统的挂载功能
  • device 设备管理功能
  • nsinit
  • other

这些功能还是很好理解的,这些都基于linux 内核相关的技术实现runc 可能对libcontainer 略有修改,但是基本上也大差不差了,它们简单来说就是管理配置容器的一组api,实现了如上的功能。

三、 cncf成立

后来谷歌等几家大公司成立cncf(cloud native cumputing funtaiotn) 谷歌顺势推出了由自己使用borg 系统改编的kubernetes,目的很明显‘我在容器这个层面干不过你,我就再上一层,容器编排调度系统’ ,docker 公司同样不甘示弱,推出了自己的swarm,结果大家都知道,swarm 在和kubernetes 的竞争中落败了(ps提前打个广告,后面我会分别写一下swarm 和kubernetes 架构以及解析,分别学习下大佬们的设计理念),不过docker 虽然失败但是也留了一手,把自己的核心依赖容器运行时(containerd)捐献给了cncf 以此来彰显自己是一个paas。

不过在我看来这个小花招真的是离谱啊,之前谷歌来求合作的时候你docker 还能占据主动,现在还自己主动把容器运行时打包贡献出去了,结果cncf 一边和docker 打的火热主动实现dockershim 来兼容kubernetes的cri,一边 狠狠地完善containerd ,现在containerd kubernetes 快要绑死了,结果现在kubernetes 在1.24之后打算移除dockershim了。自作聪明的小花招反而加速了docker 陷入困境

套盾: 本人也是docker 深度用户,很喜欢docker ,没有唱衰docker 的意思,现在提到容器技术大家第一个想到的还是docker,相信docker 未来也会越来越好。下面的意见是过去的我头脑发昏乱写的,不代表现在的我。

四、 containerd

什么是containerd 这里我们引用docker 官方社区的原文来看下 "In the simplest terms, containerd is a broadly-adopted open container runtime. It manages the complete container lifecycle of its host system! This includes pulling and pushing images as well 扩展 Docker 与 containerd 的集成 |码头工人as handling the starting and stopping of containers. Not to mention, containerd is a low-level brick in the container experience. Rather than being used directly by developers, it’s designed to be embedded into systems like Docker and Kubernetes."[原文](扩展 Docker 与 containerd 的集成 |码头工人) 简单提炼下,它是一个开源的容器运行时,它的目标使用对象不是普通开发者,而是嵌入到docker 和kubernetes中的。

以上