Docker、containerd、CRI-O 和 runc 的区别
分类:知识集锦 发布时间:2023/4/6 10:17:42

Docker 不是容器领域唯一的竞争者,现在存在着许多各种各样的容器工具,docker 就是其中一个工具,Docker 公司支持着这些工具中的一部分,但不是全部。


容器生态系统

容器生态系统由许多令人兴奋的技术、大量行话和相互竞争的大公司组成。

幸运的是,这些公司偶尔会在脆弱的休战中聚在一起以达成一些标准,这些标准有助于使生态系统在不同平台和操作系统之间更具互操作性,并减少对单个公司或项目的依赖。

需要注意的主要标准有:

Kubernetes 容器运行时接口(Container Runtime Interface (CRI)),它定义了 Kubernetes 和容器运行时之间的 API,开放容器计划(Open Container Initiative (OCI)),为镜像与容器发布规范。


Docker

我们会从 Docker 开始讲起,因为它是最出名的容器开发者工具,对于很多人来说,“ Docker ” 就是 “ 容器 ” 的同义词。

Docker 引发了之后的整场变革,Docker 创造了一个非常易于使用的容器工具:docker

docker 安装在工作站或服务器上,并附带一系列工具,使开发人员或 DevOps 人员可以轻松构建和运行容器

docker 命令行工具可以用来构建容器镜像,从注册中心拉取镜像,以及创建、启动和管理容器

为了实现这一切,docker 由下边这些项目组成(还有其它项目,但这些是主要项目):

docker-cli

这是在使用 docker ... 命令时用到的命令行工具

containerd

这是一个用来管理和运行容器的守护进程,它能推送与拉取镜像、管理存储与网络,并且能够监视运行中的容器

runc

这是一个低层的容器运行时(真正完成创建和运行容器工作的运行时)。它包含了 libcontainer,一个用于创建容器的基于 go 语言的原生实现

当使用 docker 运行一个容器时

实际上需要先经过 Docker 守护进程、containerd,最后再通过 runc 才能将其运行起来

Dockershim: Kubernetes 中的 Docker

Kubernetes 包含一个叫做 dockershim 的组件,Kubernetes 靠它来直接支持 Docker

Kubernetes 更倾向于通过支持它的容器运行时接口(Container Runtime Interface (CRI))的容器运行时来运行容器

但由于 Docker 出现在 Kubernetes 之前,所以 Docker 没有实现 CRI,这就是 dockershim 存在的原因。它的作用基本上就是将 Docker 固定到了 Kubernetes 上面,或者说是将 Kubernetes 放到了 Docker 上面

shim 原本是一种锥形的或楔形的薄片材料,用于填充两个物体之间的空隙,目的是为了让两个物体能够更好地结合在一起,或者是为了提供一个平面,也可能被用作垫片,在两个易磨损的部分之间填充空隙

在计算机编程领域,shim 表示一个类库。用来透明地解释 API 调用,通常会改变其传递的参数,自己处理相关操作或者将其重定向到别的地方

之所以用这个单词,是因为 shim 的目的是为了衔接两个部分,而自己又比较轻量级,通常 shim 用来支持在新环境中调用旧的 API,或在旧环境中调用新的 API。shim 还可以用来支持在与开发目标平台不同的软件平台上运行程序

shim 会被用来在新环境中调用旧 API,通常是因为 API 的变化,导致那些依赖旧功能的老应用程序出现了兼容性问题。在这种情况下,可以通过在新代码上增加一层薄的兼容层来支持老 API

shim 用来在旧环境中调用新 API 是指:一个类库为一个旧环境带来了新的 API,但这些 API 都只能通过调用旧环境的能力来实现。例如一个用 Docker 搭建的容器集群,想要使用 Kubernetes 的 API,此时就可以用 dockershim 来适配。

未来,Kubernetes 将会取消这种直接对接 Docker 的形式,取而代之的是,只使用实现了它的容器运行时接口的容器运行时,例如使用 containerd 或 CRI-O。

但这并不意味着 Kubernetes 不再运行 Docker 格式的容器,containerd 与 CRI-O 都可以运行 Docker 格式(准确的说是 OCI 格式)的镜像,只是不再使用 docker 命令或 Docker 守护进程了。

Dockershim 现已弃用。


Docker 镜像

大多数人所说的 Docker 镜像,实际上是按照开放容器计划(Open Container Initiative (OCI))格式打包的镜像。

因此,如果你从 Docker Hub(或其它注册中心)拉取了一个镜像,你应该可以将其与 docker 命令、Kubernetes 集群、podman 实用程序,或其它任何支持 OCI 镜像格式规范的工具一起使用。

体验创新云技术带来核心业务效率显著提升
立即预约,加速企业数字化转型进程
Copyright ⓒ 2022 苏州博纳讯动软件有限公司 国徽 苏ICP备13004761号 法律声明及隐私政策