容器的核心技术

徐小东

2023-01-03

基本概念

Container (容器):使用 Linux namespace (名字空间)、cgroups (控制组)、及 CoW (写时拷贝) 文件系统来提供应用级依赖管理的 Linux 进程组。

使用场景包括本地测试和开发、分布式生产环境,如:Kubernetes。

一般通过容器镜像和人类友好的用户接口这种标准化的方式来定义打包。OCI (Open Container Initiative) 规范定义和分发容器镜像、执行容器。

容器具有 immutability (不可变性)。

Linux 名字空间

Linux 本来有资源的全局视图,为了允许进程有资源的局部视图 (如:文件系统、网络、甚至用户等),于是 Linux 引入了名字空间。

Linux 名字空间是有关资源可见性的内容,且可以用来隔离操作系统资源的不同方面。

创建名字空间的系统调用:

查看名字空间: sudo lsns

Linux 控制组

一种管理进程组的机制,可用来控制系统资源占用,如:CPU、内存、I/O 等。

内核提供两个 cgroups 版本:

cgroups 包含 CPU、内存、I/O、PID、device 等控制器。

写时拷贝文件系统

Copy-on-Write (写时拷贝) 文件系统用来提升 I/O 速度,同时减少使用空间。

原文件 File 1 由 A、B、C 块组成,拷贝的文件叫 File 2。代替拷贝实际的块,只拷贝元数据 (块的指针)。

当 File 2 修改时 (假定 C 块更改),只拷贝 C 块:新的 C’ 块被创建,而 File 2 仍然指向未修改的 A 和 B 块。

union mounts (联合挂载):将多个目录组合 (挂载) 到一个位置,这样,对于最终目录的用户来说,该目录包含所有参与目录的组合内容。

实现包括:

在容器中,CoW 用于构建时,将应用及所有依赖打包成可分发的单一、自包含文件。通常将 CoW 文件系统与绑定挂载结合使用,以一种有效的方式将不同依赖项的内容层放在彼此之上。

参考