docker、containerd、runC、CRI、OCI分别是什么

Docker:

包括docker client和dockerd,是一个客户端工具,用来把用户的请求发送给docker daemon(dockerd)。
dockerd:dockerd是对容器相关操作的最上层封装,直接面向操作用户。

Docker daemon,一般也会被称为docker engine。dockerd启动时会启动containerd 子进程。

Containerd:

一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。它可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。
详细点说,Containerd 负责干下面这些事情:
- 管理容器的生命周期(从创建容器到销毁容器)
- 拉取/推送容器镜像
- 存储管理(管理镜像及容器数据的存储)
- 调用 runC 运行容器(与 runC 等容器运行时交互)
- 管理容器网络接口及网络

RunC:

RunC 是一个轻量级的工具,它是用来运行容器的,可以把它理解为实现了 OCI 定义的接口的工具

OCI:

OCI(open Container Initiative)容器标准化组织的主要目的是推进容器技术的标准化。对容器标准进行准确的定义。其主要目的是为了解决容器标准混乱的问题。没有统一的容器标准,工业界就无法按照统一的标准进行容器开发。因此OCI于2015年由docker牵头和其他公司制定了相应的容器标准。
OCI目前包含两个标准: runtime-spec和image-spec。分别定义了容器运行时标准和容器镜像标准。

CRI:

是 Kubernetes 用来控制创建和管理容器的不同运行时的 API,它使 Kubernetes 更容易使用不同的容器运行时。它一个插件接口,这意味着任何符合该标准实现的容器运行时都可以被 Kubernetes 所使用

简单总结:

  • Docker:引擎部分 dockerd 封装了 Containerd,提供 client 端由客户操作,用户级别的产品
  • Containerd:封装了 RunC,提供更丰富功能,适用于工业级需求(对接大型系统,如k8s)
  • RunC : 实现了 OCI 标准,可以实现容器的创建,功能比较简单
  • OCI :是个容器和镜像标准,定义了一些接口和规范