乐趣区

关于container:Container-Runtime-一-介绍

前言
在波及到容器时你常常听到一个术语:容器运行时。每个人对这个术语都有不同的了解,即便在容器社区也是这种状况。这篇文章是这个系列文章的第一篇,它们别离是:

  • 容器运行时介绍:为什么它们令人如此困惑?
  • 深刻Low-Level 运行时
  • 深刻High-Level 运行时
  • Kubernetes 运行时和 CRI

    这篇文章将会介绍容器运行时是什么和为什么会让人如此困惑,而后深刻介容器运行时不同的类型,它们是如何工作的以及它们之间的不同点。


    通常来说,一个计算机程序员可能将一个程序的运行周期了解为 ” 运行时 ”,或者是反对其运行的语言的特定实现,其中的一个例子是 `Java HotSpot 运行时,后者更靠近 ” 容器运行时 ” 的概念。容器运行时负责一个容器运行的所有局部,而容器实际上并未在运行程序自身。正如咱们将从本系列文章中看到的那样,运行时实现了各个级别的性能个性,但实际上运行一个容器就是调用容器运行时所需的全副。

为什么容器让人如此困惑?

Docker 于 2013 年公布,它端到端地解决了开发者运行容器的诸多问题:

  • 容器镜像格局
  • 构建镜像的办法(Dcokerfile/docker build
  • 治理容器镜像的办法(Docker images, docker rm, etc
  • 治理容器实例的办法(docker ps, docker rm, etc
  • 分享容器镜像的办法(docker push/pull
  • 运行容器的办法(docker run

在那时,Docker 是一个一体化的零碎,然而事实上这些性能个性彼此之间并没有相互依赖,它们中的每一个都能够在一个更小更专一的工具实现,每个工具都能够在一个通用的规范(容器规范)下一起应用。因为这个缘故,Docker,Google,CoreOS以及其余的供应商一起创建了凋谢容器标准(OCI),同时他们拆分了容器运行这部分的代码将其作为一个工具或 lib 库称之为 run c, 而后捐献给OCI 作为 OCI 运行规范的参考范例。
最后,这使 Docker 对 OCI 的捐献感到困惑,他们捐献的是一个规范而不是运行容器的办法,其中并没有蕴含镜像格局或者镜像仓库拉取推送规定,当你运行一个 Docker 容器的时候,它们实际上通过了以下的步骤:

  • 下载镜像
  • 将镜像文件解开为 bundle 文件,将一个文件系统拆分成多层
  • bundle 文件运行容器

Docker 标准化的仅仅是第三步。在此之前,每个人都认为容器运行时反对 Docker 反对的所有性能。最终,Docker 方面廓清:原始 OCI 标准指出,只有“运行容器”的局部组成了runtime。这种“概念失联”始终继续到明天,并使“容器运行时”成为一个令人困惑的话题。心愿我能证实单方都不是齐全谬误的,并且在本博文中将宽泛应用该术语。

Low-Level 和 High-Level 容器运行时

当人们想到容器运行时时,可能会想到许多示例。runc,lxc,lmctfy,Docker(containerd),rkt,cri-o。这些中的每一个都是针对不同的状况而构建的,并实现了不同的性能。有些容器(例如 containerdcri-o容器)实际上应用 runc 来运行容器,在 runc 之上实现了镜像治理和 API 接口。与 runcLow-Level个性相比,您能够将这些性能(包含图像传输,图像治理,图像解压缩和 API)视为 High-Level 个性。思考到这点,能够看到容器运行时空间相当简单,每个运行时涵盖了从 Low-LevelHigh-Level的不同局部,这里有一张十分直观的图:

因而,从理论登程,通常只专一于正在运行的容器的 runtime 通常称为“Low-Level容器运行时”,反对更多高级性能(如镜像治理和 gRPC / Web API)的运行时通常称为“High-Level 容器运行时”,“High-Level容器运行时”或通常仅称为“容器运行时”,我将它们称为“高级容器运行时”。值得注意的是,Low-Level容器运行时和 High-Level 容器运行时是解决不同问题的、从根本上不同的事物。容器是通过 Linux nanespaceCgroups实现的,Namespace能让你为每个容器提供虚拟化系统资源,像是文件系统和网络,Cgroups提供了限度每个容器所能应用的资源的如内存和 CPU 使用量的办法。在最低级别的运行时中,容器运行时负责为容器建设 namespacescgroups, 而后在其中运行命令,Low-Level容器运行时反对在容器中应用这些操作系统个性。

通常状况下,开发人员想要运行一个容器不仅仅须要 Low-Level 容器运行时提供的这些个性,同时也须要与镜像格局、镜像治理和共享镜像相干的 API 接口和个性,而这些个性个别由 High-Level 容器运行时提供。就日常应用来说,Low-Level容器运行时提供的这些个性可能满足不了日常所需,因为这个缘故,惟一会应用 Low-Level 容器运行时的人是那些实现 High-Level 容器运行时以及容器工具的开发人员。那些实现 Low-Level 容器运行时的开发者会说 High-Level 容器运行时比方 containerdcri-o不像真正的容器运行时,因为从他们的角度来看,他们将容器运行的实现外包给了 runc。然而从用户的角度来看,它们只是提供容器性能的单个组件,能够被另一个的实现替换,因而从这个角度将其称为runtime 依然是有意义的。即便 containerdcri-o都应用runc,然而它们是截然不同的我的项目,反对的个性也是十分不同的。

退出移动版