这些概念可以分为:
定义:OCI 是一个开放标准,用于定义容器格式和运行时的规范。它旨在确保容器镜像的格式和容器运行时的操作方式在不同的实现之间保持兼容性。
• 主要组件:
• OCI 镜像规范:定义了容器镜像的存储和分发格式。
• OCI 运行时规范:定义了如何运行和管理容器,例如容器的生命周期、资源限制等。
• 典型实现:像 runc 就是一个 OCI 标准的运行时实现,负责实际运行容器。
官方文档: https://opencontainers.org/
OCI为容器运行时规范,其实现产品产品有:containerd、Docker、CRI-O、runc、LXC等等
在容器技术中,容器运行时可以分为三种类型:
低级运行时:指的是负责容器隔离和生命周期管理的基本运行时组件。在这种运行时中,容器是通过Linux内核的cgroups和namespace机制进行隔离和管理的。常见的低级运行时包括Docker的runc、lxc等。这种运行时通常具有轻量化和高性能的优点,但缺乏高级特性和管理工具。
高级运行时:是在低级运行时的基础上,提供了更丰富的特性和管理工具的容器运行时。这些特性可以包括容器网络、存储、监控、镜像传输、镜像管理、镜像API等功能,以及各种管理工具等。常见的高级运行时包括Docker、Containerd和CRI-O等。这种运行时通常具有更为丰富的特性和管理工具,但也带来了更高的复杂性和资源消耗。
沙盒或虚拟化运行时:是在容器运行时中使用沙盒技术或虚拟化技术实现容器隔离和管理的运行时。这种运行时通常具有更强的隔离性和安全性,但也会带来更高的性能开销和复杂性。常见的沙盒或虚拟化运行时包括gVisor、Kata Containers等。
containerd 诞生于原始 Docker 项目,后被单独拆分出来作为独立的一部分,可以不与Docker绑定。它负责管理容器的生命周期(创建、启动、停止)以及镜像的拉取、存储等操作。
特点:轻量级、模块化,提供核心的容器管理功能。是 Kubernetes 默认的容器运行时(通过 CRI 集成)。 符合 OCI 规范,支持标准的容器镜像和容器规范。使用场景:广泛用于 Kubernetes 环境,适合需要高效、稳定运行时的场景。
这里的Docker指Docker Engine。Docker 是一个大而完备的应用,提供了丰富的开发工具,支持容器的构建、运行、网络、存储管理。
特点:提供了丰富的开发工具,支持容器的构建、运行、网络、存储管理。拥有 Docker Hub 这样的大规模公共镜像库。支持多平台,包括 Linux、Windows 和 macOS。使用场景:适用于开发者进行本地开发、测试和小规模生产环境。
Docker 由 3 部分构成:Docker Server (docker daemon, 简称 dockerd)、REST API 和 Docker CLI。借助 Docker Engine 既能便捷地运行容器进程进行集成开发、也能快速构建分发镜像。Docker 与containerd的关系如下。
CRI-O 是专门为 Kubernetes 设计的轻量级容器运行时,旨在通过遵循 Kubernetes 的 CRI(Container Runtime Interface)规范,简化与 Kubernetes 的集成。CRI-O 使用 OCI 容器镜像格式和 runc 作为默认运行时。
特点:专为 Kubernetes 优化,减少了与 Docker 一样的额外功能,轻量级且更高效。兼容 OCI 标准,支持标准的镜像格式和运行时。易于与 OpenShift 等 Kubernetes 发行版集成。适合在大规模生产环境下使用,特别是与 Kubernetes 搭配使用。
runc 是一个符合 OCI 标准的命令行工具,用于根据容器配置文件创建和运行容器。它最初由 Docker 开发,现在已经成为一个独立项目,并作为很多容器运行时的底层执行引擎。属于低级运行时。
特点:非常轻量,专注于启动和运行容器。符合 OCI 容器运行时规范,作为标准容器运行时的核心组件。是 containerd 和 CRI-O 的底层运行时。使用场景:用于开发自定义容器运行时,或者作为容器执行引擎集成在其他运行时中。
LXC 是 Linux 上最早的容器化技术之一,基于 Linux 内核的 cgroups 和 namespaces 提供轻量级的容器管理。尽管 Docker 现在已经广泛流行,LXC 仍然被某些特定场景下使用。
特点: 基于内核的轻量级容器技术。 提供与传统虚拟机类似的用户体验,支持复杂的网络和存储配置。使用场景:适用于那些需要稳定、长期支持的容器化工作负载,特别是在嵌入式系统或老旧系统中
Kubernetes中的Kubelet组件通过Container Runtime Interface (CRI)与容器运行时交互。
容器运行时接口(CRI)是 在 kubelet 与容器运行时之间通信的主要协议。Kubernetes 容器运行时接口(CRI)定义了在节点组件 kubelet 和容器运行时之间通信的主要 gRPC 协议
文档网址:https://kubernetes.io/docs/concepts/architecture/cri/
如上图,在Kubernetes<1.24版,通过dockershim操作dockerd,实现对容器运行时的操纵。在Kubernetes 1.24 版本中移除 dockershim,也无需dockerd作为中介,直接操作容器。
另:dockershim原由Kubernetes维护,被移除淘汰后不再维护。后Mirantis和Docker接手将dockershim改名为cri-dockerd并继续维护。cri-dockerd是一个“垫片”适配器,使得可以通过Kubernetes的CRI来控制Docker(Docker Engine)。其官网:
https://mirantis.github.io/cri-dockerd/
2018年Containerd的1.1版本集成了以前在外部CRI-Containerd,以CRI plugin插件形式作为containerd内的一部分。见下图: