引言

这是系列文章的第三篇,在第一篇文章中,概述了容器运行时,同时介绍了低级容器运行时与高级容器运行时之间的区别;在第二篇文章中我详细介绍了低级容器运行时,并构建了一个简单的低级容器运行时。高级容器运行时的技术栈要高于低级容器运行时,低级容器运行时负责容器的实际运行,而高级容器运行时负责容器镜像额传输和管理。

通常,高级运行时提供了守护程序应用程序和API,远程应用程序可以使用它们来逻辑运行容器并对其进行监视,但 它们位于底层运行时或委托给底层运行时或其他高层运行时进行实际工作。

高级运行时还可以提供听起来有些低级的功能,但这些功能可以在计算机上的各个容器中使用。 例如,其中一个功能可能是网络名称空间的管理,并允许容器加入另一个容器的网络名称空间。

这里有一个概念图,用于了解各个组件如何组合在一起:
image.png

高级运行时示例

为了更好地理解高级运行时,请看一些示例。 像低级运行时一样,每个运行时都实现了不同的功能。

Docker

Docker是最早的开源容器运行时之一。 它是由提供PaSS服务的公司dotCloud开发的,用于在容器中运行其用户的Web应用程序。

Docker是一个容器运行时,其中包含构建,打包,共享和运行容器。 Docker具有C/S架构,最初是作为整体守护程序,dockerd和docker client程序构建的。 该守护程序提供了构建容器,管理镜像和运行容器的大多数逻辑,以及一个API,可以从客户端命令行运行命令从守护程序获取信息。

它是第一个流行的运行时,它整合了在构建和运行容器的生命周期中所需的全部功能。

Docker最初同时实现了高级和低级运行时功能,但后来这些部分被分解为runc和容器化的单独项目。 Docker现在包括dockerd守护程序,docker-containerd守护程序以及docker-runc。 docker-containerd和docker-runc只是Docker打包的“香草”容器和runc的版本。
image.png
dockerd提供诸如构建镜像之类的功能,而dockerd使用docker-containerd提供诸如镜像管理和运行中的容器之类的功能。 例如,Docker的构建步骤实际上只是一些逻辑,该逻辑解释Dockerfile,使用containerd在容器中运行必要的命令,并将生成的容器文件系统保存为镜像。

containerd

containerd是从Docker分离出来的高级运行时。 就像runc一样被分解为低级运行时组件,containered也被分解为Docker的高级运行时组件。

containerd实现下载镜像,管理镜像以及从镜像运行容器。 当需要运行容器时,它将镜像解压缩到OCI runtime bundle中,然后将其打包到runc来运行它。

容器化还提供了可用于与其交互的API和客户端应用程序,容器命令行客户端是ctr。

ctr相关命令
提取容器镜像:

$ sudo ctr images pull docker.io/library/redis:latest

列出当前所有镜像:

$ sudo ctr images list

从镜像运行一个容器:

$ sudo ctr container create docker.io/library/redis:latest redis

列出运行的容器:

$ sudo ctr container list

停止容器:

$ sudo ctr container delete redis

这些命令类似于用户与Docker交互的方式,但是,与Docker相比,containerd只专注于运行中的容器,因此它不提供构建容器的机制。 Docker专注于最终用户和开发人员用例,而containerd则专注于操作具体的容器实例,例如在服务器上运行容器,而诸如构建容器镜像之类的任务留给其他工具处理。

rkt

在上一篇文章中,我提到rkt同时具有低级和高级功能的运行时,与Docker一样,rkt允许您构建容器镜像,在本地存储库中获取和管理容器镜像,并通过单个命令运行它们。 rkt缺乏Docker的功能,因为它不提供长期运行的守护程序和远程API。

你可以使用如下命令获取远程镜像:

$ sudo rkt fetch coreos.com/etcd:v3.3.10

列出本地镜像:

$ sudo rkt image list
ID                      NAME                                    SIZE    IMPORT TIME     LAST USED
sha512-07738c36c639     coreos.com/rkt/stage1-fly:1.30.0        44MiB   2 minutes ago   2 minutes ago
sha512-51ea8f513d06     coreos.com/oem-gce:1855.5.0             591MiB  2 minutes ago   2 minutes ago
sha512-2ba519594e47     coreos.com/etcd:v3.3.10                 69MiB   25 seconds ago  24 seconds ago

删除镜像:

$ sudo rkt image rm coreos.com/etcd:v3.3.10                       
successfully removed aci for image: "sha512-2ba519594e4783330ae14e7691caabfb839b5f57c0384310a7ad5fa2966d85e3"
rm: 1 image(s) successfully removed

尽管rkt似乎并没有得到积极发展,但它是一个有趣的工具,并且是容器技术历史上的重要组成部分。


EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术