Docker与Kubernetes容器虚拟化技术与应用
上QQ阅读APP看书,第一时间看更新

1.2.2 容器的标准化

当前,Docker几乎是容器的代名词,很多人以为Docker就是容器。其实,这是错误的认知,容器除了Docker外,还有CoreOS。

当然有不同就容易出现分歧,所以任何技术的出现都需要一个标准来规范它,否则容易导致技术实现的碎片化,出现大量的冲突和冗余。

因此,在2015年,成立了由Google、Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织,并于2016年4月推出了第一个开放容器标准。

该标准主要包括容器镜像标准(image spec)和容器运行时标准(runtime spec)。容器标准的推出有助于为成长中的市场带来稳定性,让企业能放心地采用容器技术;用户在打包、部署应用程序后,可以自由选择不同的容器Runtime;同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范来做。

1.容器镜像标准

(1)一个镜像由4部分组成:manifest、Image Index(可选)、layers和Configuration。

①manifest文件。

manifest文件包括镜像内容的元信息和镜像层的摘要信息,这些镜像层可以解包部署成最后的运行环境、镜像的config文件索引、有哪些layer及额外的annotation信息。manifest文件中保存了很多与当前平台有关的信息。

②Image Index文件。

从更高的角度描述了manifest信息,主要应用于镜像跨平台可选的文件,指向不同平台的manifest文件,其作用是确保镜像能跨平台使用。每个平台都拥有着不同的manifest文件,但都会使用index文件作为索引。

③layers文件。

以layer保存的文件系统,每个layer保存了和上层之间变化的部分,layer应该保存哪些文件,以及如何表示增加、修改和删除的文件等。

④Configuration文件。

config文件包含了应用的参数环境,保存了文件系统的层级信息(每个层级的hash值、历史信息),以及容器运行时需要的一些信息(如环境变量、工作目录、命令参数、mount列表等),指定了镜像在某个特定平台和系统的配置。比较接近使用docker inspect<image_id>时看到的内容。

(2)根据存储内容的密码学哈希值来找到镜像存储的位置,根据内容寻址描述格式。

(3)一种格式存储CAS斑点并引用它们(可选OCI层)。

(4)签名是基于签名的图像内容的地址(可选OCI层)。

(5)命名是联合基于DNS,可以授权(可选OCI层)。

2.容器运行时标准

1)creating(创建中)

使用create命令创建容器,这个过程称为创建中。

2)created(创建后)

容器创建出来,但是还没有运行,表示镜像和配置没有错误,容器能够在当前平台运行。

3)running

容器的运行状态,里面的进程处于up状态,正在执行用户设定的任务。

4)stopped

容器运行完成,或者运行出错,或者运行stop命令后容器处于暂停状态。这个状态下,容器还有很多信息保存在平台中,并没有完全被删除。

容器标准格式也要求容器把自身运行时的状态持久化到磁盘中,这样便于外部的其他工具对此信息使用和演绎,运行时状态会以JSON格式编码存储。推荐把运行时状态的JSON文件存储在临时文件系统中,以便系统重启后会自动移除。

一个state.json文件中包含的具体信息如下。

1)版本信息

存放OCI标准的具体版本号。

2)容器ID

通常是一个哈希值,也可以是一个易读的字符串。在state.json文件中加入容器ID是为了便于之前提到的运行时hooks只需载入state.json就可以定位到容器,然后检测state.json,若发现文件不见了就判定为容器关停,再执行相应预定义的脚本操作。

3)PID

容器中运行的首个进程在宿主机上的进程号。

4)容器文件目录

存放容器rootfs及相应配置的目录。外部程序只需读取state.json即可定位到宿主机上的容器文件目录。 标准的容器生命周期应该包含3个基本过程。

(1)容器创建。

容器创建包括文件系统、namespaces、cgroups、用户权限在内的各项内容的创建。

(2)容器进程的启动。

运行容器进程,进程的可执行文件定义在config.json中的args项。

(3)容器暂停。

容器实际上作为进程可以被外部程序关停(kill),容器标准规范应该包含对容器暂停信号的捕获,并做相应资源回收的处理,避免孤儿进程的出现。

总的来说,容器镜像标准定义了容器镜像的打包形式(pack format),而容器运行时标准定义了如何运行一个容器。