runc和oci之间的关系

82 阅读2分钟

容器是整个云计算形成的重要基础之一,并且还在不断地迭代结构。近年来不断出现的docker、oci、runc、containerd、podman 等都和其相关,这里整理一下他们之间的联系,方便大家对其有个直观的理解。

整个云计算的依赖图如下图所示,最底层则构建在runc跑起来的容器之上。

在这里插入图片描述

OCI

OCI 定义了容器能够跑起来的重要标准,为什么需要这个标准?因为不同的linux平台、架构要运行容器就需要接入不同的底层库,定义了OCI 规范实际上是定义了不同平台向上接入的统一标准。

OCI标准定义了如何运行容器以及如何管理容器映像:

  • 管理容器映像主要涉及容器镜像标准,oci的image spec定义了 ??

  • 运行容器主要涉及容器的生命周期的管理,oci的runtime spec标准中对于容器的状态描述,以及对于容器的创建、删除、查看等操作进行了定义。

上述的容器映像容易理解,众所周知linux中的一切都是文件,因此把其中最核心的部分抽取出来并做成layer的形式,就接近一个容器映像 ??

何为运行容器呢?容器本质上就是几个依赖获取的有限系统资源的进程集合。容器技术的几个关键点就在于包括用于资源限制的cgroup、用于隔离的namespace,以及基础的 linux kernel 等。

runc

runc技术实现了 oci规范,是docker贡献给了oci 的容器方案。

runc在实现上可以分为两层

  1. 基于 libcontainer 实现底层隔离,网络等,libcontainer库主要为重新封装了底层操作系统的系统调用;实现 docker文件系统;

  2. 提供指令调用。主要包括生命周期调用指令的实现,cmd的实现等。

关于runc 的演进历史。

我们知道docker最早是2013年发布的,而oci规范标准则是2015年出来的。

docker的技术最开始是依赖 lxc 虚拟化,libcontainer,之后runc,在代码上逐渐从混入过度到分离功能的层次。