容器技术随着 docker 的出现煊赫一时,全部的技术公司都积极拥抱容器,促进了 docker 容器的繁荣发展。容器一词虽然口口相传,但却没有统一的定义,这不只是个技术概念的问题,也给整个社区带来一个阴影:容器技术的标准究竟是什么?由谁来决定?git
不少人可能以为 docker 已经成为了容器的事实标准,那咱们以它做为标准问题就解决了。事情并无那么简单,首先是否表示容器彻底等同于 docker,不容许存在其余的容器运行时(好比 coreOS 推出的 rkt);其次容器上层抽象(容器集群调度,好比 kubernetes、mesos 等)和 docker 紧密耦合,docker 接口的变化将会致使它们没法使用。github
总的来讲,若是容器以 docker 做为标准,那么 docker 接口的变化将致使社区中全部相关工具都要更新,否则就没法使用;若是没有标准,这将致使容器实现的碎片化,出现大量的冲突和冗余。这两种状况都是社区不肯意看到的事情,OCI(Open Container Initiative) 就是在这个背景下出现的,它的使命就是推进容器标准化,容器能运行在任何的硬件和系统上,相关的组件也没必要绑定在任何的容器运行时上。docker
官网上对 OCI 的说明以下:express
An open governance structure for the express purpose of creating open industry standards around container formats and runtime. – Open Containers Official Siteide
OCI 由 docker、coreos 以及其余容器相关公司建立于 2015 年,目前主要有两个标准文档:容器运行时标准 (runtime spec)和 容器镜像标准(image spec)。工具
这两个协议经过 OCI runtime filesytem bundle 的标准格式链接在一块儿,OCI 镜像能够经过工具转换成 bundle,而后 OCI 容器引擎可以识别这个 bundle 来运行容器。spa
下面,咱们来介绍这两个 OCI 标准。由于标准自己细节不少,并且还在不断维护和更新,若是不是容器的实现者,没有必须对每一个细节都掌握。因此我以介绍概要为主,给你们有个主观的认知。orm
OCI 容器镜像主要包括几块内容:索引
文件系统:以 layer 保存的文件系统,每一个 layer 保存了和上层之间变化的部分,layer 应该保存哪些文件,怎么表示增长、修改和删除的文件等接口
config 文件:保存了文件系统的层级信息(每一个层级的 hash 值,以及历史信息),以及容器运行时须要的一些信息(好比环境变量、工做目录、命令参数、mount 列表),指定了镜像在某个特定平台和系统的配置。比较接近咱们使用 docker inspect <image_id> 看到的内容
manifest 文件:镜像的 config 文件索引,有哪些 layer,额外的 annotation 信息,manifest 文件中保存了不少和当前平台有关的信息
index 文件:可选的文件,指向不一样平台的 manifest 文件,这个文件能保证一个镜像能够跨平台使用,每一个平台拥有不一样的 manifest 文件,使用 index 做为索引
OCI 对容器 runtime 的标准主要是指定容器的运行状态,和 runtime 须要提供的命令。下图能够是容器状态转换图:
init 状态:这个是我本身添加的状态,并不在标准中,表示没有容器存在的初始状态
creating:使用 create 命令建立容器,这个过程称为建立中
created:容器建立出来,可是尚未运行,表示镜像和配置没有错误,容器可以运行在当前平台
running:容器的运行状态,里面的进程处于 up 状态,正在执行用户设定的任务
stopped:容器运行完成,或者运行出错,或者 stop 命令以后,容器处于暂停状态。这个状态,容器还有不少信息保存在平台中,并无彻底被删除