在容器镜像的考察中,我讨论了容器的基础知识,但现在是时候深入研究容器运行时了,以便您可以理解容器环境是如何构建的。本文中的信息部分摘自开放容器倡议组织 (OCI) 的官方文档,OCI 是容器的开放标准,因此无论您使用何种容器引擎,此信息都适用。
容器运行时
那么,当您运行 podman run
或 docker run
命令时,后端真正发生了什么?这是一个逐步概述,供您参考
- 如果本地没有镜像,则从镜像仓库拉取镜像
- 镜像被提取到写时复制文件系统上,所有容器层相互覆盖以创建合并的文件系统
- 准备容器挂载点
- 从容器镜像设置元数据,包括覆盖 CMD、ENTRYPOINT(来自用户输入)、设置 SECCOMP 规则等设置,以确保容器按预期运行
- 内核收到警报,为该容器分配某种隔离,例如进程、网络和文件系统(命名空间)
- 内核还收到警报,为该容器分配一些资源限制,例如 CPU 或内存限制(cgroups)
- 系统调用 (syscall) 被传递到内核以启动容器
- 设置 SELinux/AppArmor
容器运行时负责处理以上所有步骤。当我们想到容器运行时时,首先想到的可能是 runc、lxc、containerd、rkt、cri-o 等。好吧,您没有错。这些都是容器引擎和容器运行时,每个都为不同的情况而构建。
容器运行时更侧重于运行容器、为容器设置命名空间和 cgroups,也称为较低级别的容器运行时。更高级别的容器运行时或容器引擎侧重于格式、解包、管理和镜像共享。它们还为开发人员提供 API。
开放容器倡议组织 (OCI)
开放容器倡议组织 (OCI) 是一个 Linux 基金会项目。其目的是围绕如何使用容器运行时和容器镜像格式来设计某些开放标准或结构。它由 Docker、rkt、CoreOS 和其他行业领导者于 2015 年 6 月成立。
它通过两个规范来实现这一点
1. 镜像规范 (image-spec)
此规范的目标是使创建可互操作的工具成为可能,用于构建、传输和准备要运行的容器镜像。
规范的高级组件包括
- 镜像清单 — 描述构成容器镜像的元素的文档
- 镜像索引 — 镜像清单的带注释索引
- 镜像布局 — 表示镜像内容的文件系统布局
- 文件系统层 — 描述容器文件系统的变更集
- 镜像配置 — 确定图层顺序和镜像配置的文档,适用于转换为运行时包
- 转换 — 解释应如何进行此转换的文档
- 描述符 — 描述引用内容的类型、元数据和内容地址的引用
2. 运行时规范 (runtime-spec)
本规范旨在定义容器的配置、执行环境和生命周期。config.json 文件为所有受支持的平台提供容器配置,并详细说明了启用容器创建的字段。详细说明了执行环境以及为容器生命周期定义的通用操作,以确保在容器内运行的应用程序在运行时之间具有一致的环境。
Linux 容器规范使用各种内核功能,包括命名空间、cgroups、capabilities、LSM 和文件系统 jail,以实现该规范。
现在您知道了
容器运行时由 OCI 规范管理,以提供一致性和互操作性。许多人在不需要了解容器工作原理的情况下使用容器,但是当您需要对如何使用容器进行故障排除或优化时,了解容器是一个宝贵的优势。
本文基于一篇 techbeatly 文章,并已获得许可进行改编。
评论已关闭。