1. 背景
2013年Docker开源了容器镜像格式和运行时以后,为业界提供了一种更为轻量、灵活的“计算、网络、存储”资源虚拟化和管理的解决方案并且迅速火了起来。
2014年更是容器技术发展的一个爆发点,各种容器编排工具也逐步开始发力。值得一提的是Google发布了Kubernetes的第一个Release版本,现已成长为容器编排领域的领导者。
为了推进容器生态的健康发展。在Linux基金会的主导下,Docker和各大云厂商积极响应于2016年成立了 “Open Container Initiative(OCI)”,旨在主导容器的生态发展方向,促进容器生态的健康发展。
2.OCI规范
OCI(Open Container Initiative)规范是事实上的容器标准, 分为 Image spec
和 Runtime spec
两部分,它们分别覆盖了容器生命周期的不同阶段:
2.1 容器镜像规范
镜像规范定义了如何创建一个符合 OCI 规范的镜像,它规定了镜像的构建系统需要输出的内容和格式,输出的容器镜像可以被解包成一个 runtime bundle
,runtime bundle
是由特定文件和目录结构组成的一个文件夹,从中可以根据运行时标准运行容器。
容器镜像规范要求镜像内容必须包含以下3部分:
-
Image Manifest:提供了镜像的配置(Image Configuration)和文件系统层定位信息(Image Layer Filesystem Changeset),可以看作是镜像的目录,每一个目录由一个镜像层id(Layer_id),文件格式为
json
。 -
Image Layer Filesystem Changeset:序列化之后的文件系统和文件系统变更,它们可按顺序一层层应用为一个容器的 rootfs,因此通常也被称为一个
layer
(镜像层),文件格式可以是tar
,gzip
等存档或压缩格式。 -
Image Configuration:包含了镜像在运行时所使用的执行参数以及有序的 rootfs 变更信息,文件类型为
json
2.2 联合文件系统
主要作用将多个不同位置的目录联合挂载到同一个目录下
创建容器时所新增的可写 layer
我们称为 container layer
,容器运行阶段对文件系统的变更都只会写入到该 layer
中,包括对文件的新增、修改和删除,而不会改变更低层的原有镜像内容,这极大提升了镜像的分发效率。在镜像层和 container layer
之间的 init
层记录了容器在启动时写入的一些配置文件,这一过程发生在新增读写层之前,我们不希望把这些数据写入到原始镜像中。
这两个新增的层仅在容器运行阶段存在,容器删除后它们也会被删除。同一个镜像可以创建多个不同的容器,仅需要创建多个不同的可写层;运行时更改过的容器也可以重新打包为一个新的镜像,将可写层添加到新镜像的只读层中即可
2.3 容器运行时规范
运行时规范描述了容器的配置、执行环境和生命周期。它详细描述了不同容器运行时架构的配置文件 config.json
的字段格式,如何在执行环境中应用、注入这些配置,以确保容器内运行的程序在不同运行时之间环境一致,并通过容器的生命周期定义了一套统一的操作行为。
OCI Image 可通过镜像名称发现、下载、hash值来验证、签名受信以及解包成 OCI 运行时 Bundle。一个标准的容器 bundle 包含容器加载和运行所有所需的信息,其包含如下:
-
config.json 容器配置数据文件,必须与文件系统同目录下,文件名必须为 config.json。
-
root filesystem 容器 root 文件系统(启动的只读文件),在 config.json 文件内有指定 root.path。
2.4 容器生命周期
规范中只定义了4种容器状态,运行时实现可以在规范的基础上添加其他状态,同时标准还规定了运行时必须支持的操作:
-
Query State,查询容器的当前状态
-
Create,根据镜像及配置创建一个新的容器,但是不运行用户指定程序
-
Start,在一个已创建的容器中运行用户指定程序
-
Kill,发送特定信号终止容器进程
-
Delete,删除已停止容器所创建的资源
每个操作之前或之后还会触发不同的 hooks,符合规范的运行时必须执行这些 hooks。
3 总结
1.制定容器格式标准的宗旨就提高镜像通用性以便不限于某种特定操作系统、硬件、CPU架构、公有云
等; 概括来说就是不受上层结构的绑定,如特定的客户端、编排栈
等
2.两个协议通过 OCI runtime filesytem bundle的标准格式连接在一起,OCI 镜像可以通过工具转换成bundle然后OCI容器引擎能够识别这个 bundle 来运行容器, 其优点如下;
- 操作标准化:容器的标准化操作包括使用标准容器创建、启动、停止容器,使用标准文件系统工具复制和创建容器快照,使用标准化网络工具进行下载和上传。
- 内容无关:内容无关指不管针对的具体容器内容是什么,容器标准操作执行后都能产生同样的效果。如容器可以用同样的方式上传、启动,不管是PHP应用还是MySQL数据库服务。
- 基础设施无关:无论是个人的笔记本电脑还是AWS S3,亦或是OpenStack,或者其它基础设施,都应该对支持容器的各项操作。
- 为自动化量身定制:制定容器统一标准,是的操作内容无关化、平台无关化的根本目的之一,就是为了可以使容器操作全平台自动化。
- 工业级交付:制定容器标准一大目标,就是使软件分发可以达到工业级交付成为现实