7.1 容器技术的优点
容器本质上是受到资源限制,彼此间相互隔离的若干个 Linux 进程集合。容器技术借助 cgroups、namespace,以及 Linux 内核等技术从而应用可以在沙箱环境中独立运行,从而避免之间的冲突和影响。
容器技术最大的特点是提供了一种标准化的交付方式,可用于将应用以及依赖整体打包,使应用不再受到环境限制,简化应用构建、测试、部署流程,实现 一次编译,随处运行的大目标。
容器技术的主要优点是对计算机各类资源进行抽象,并结合镜像技术使其轻量且可移植。容器技术与虚拟机对比,优点如下:
- 轻量: 容器共享计算机操作系统内核,无需为每个应用程序提供完整的操作系统实例,容器体积更小,依赖更少。与虚拟机相比,这意味着可以快速运行,更好地支持横向扩展的云原生应用程序。
- 可移植且平台独立: 容器包含所有的依赖关系,这意味着软件一次编写即可运行,交付时无需再配置各类环境。由于跨平台部署的可移植性/一致性以及体积优势,容器非常适用于如 DevOps、Serverless 以及微服务这类的现代开发和应用模式。
- 利用率高:容器结合容器编排系统如 Kubernetes 可以更精细地部署和扩展应用组件,实现资源利用以及业务稳定、可靠运行之间的平衡。
7.2 容器技术的核心原理
容器本质上是受到资源限制,彼此间相互隔离的若干个 Linux 进程集合。容器技术借助 cgroups、namespace,以及 Linux 内核等技术从而应用可以在沙箱环境中独立运行,从而避免之间的冲突和影响。
容器的核心技术主要有三点:使用 Namespace 用来进行资源隔离、使用 Cgroups 进行资源限制、基于 Unionfs 设计了镜像分层机制。
7.2.1 Namespace 资源隔离
Linux Namespace 提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的 Namespace 中来实现资源隔离的目的。
举例说明:进程 A 和进程 B 分别属于两个不同的 Namespace,进程 A 将可以使用 Linux 内核提供的所有 Namespace 资源:如独立的主机名,独立的文件系统,独立的进程编号等等。同样进程 B 也可以使用同类资源,但其资源与进程 A 使用的资源相互隔离,彼此无法感知。从用户层面来看,进程 A 读写属于 A 的 Namespace 资源,进程 B 读写属于 B 的 Namespace 资源,彼此之间安全隔离。
各类的容器技术利用 Linux Namespace 特性,实现了容器之间资源隔离。毫不夸张地说 namespace 是整个 Linux 虚拟化,甚至更进一步也可以说是前云计算潮流的基石。
Linux 通过对内核资源进行封装抽象,提供了八类系统资源的隔离(Namespace):
类型 | 用途 |
---|---|
Cgroup | Cgroup root directory cgroup 根目录 |
IPC | System V IPC, POSIX message queues 信号量,消息队列 |
Network | Network devices, stacks, ports, etc.网络设备,协议栈,端口等等 |
Mount | Mount points 挂载点 |
PID | Process IDs 进程号 |
User | 用户和组 ID |
UTS | 系统主机名和 NIS(Network Information Service) 主机名(有时称为域名) |
Time | 时钟 |
7.2.2 Cgroups 资源限制
Namespace 对各类 Linux 资源(进程、网络、文件、用户…)提供了隔离机制,但还没有解决资源分配的问题。虽然容器之间的资源是隔离的,但如果一个容器应用执行大量计算任务长期占用 CPU,还是会对其他容器应用产生影响。因此,容器技术还需要一种资源管理的机制 - 这就是 Cgroups。
Cgroups 全称是 Control Groups,是 Linux 内核提供的一种可以限制单个或者多个进程多所使用物理资源的机制,可以对 CPU、内存、I/O、网络等资源实现精准的控制。到目前为止,Linux 支持 12 种 subsystem (一个子系统代表一类资源调度控制器),支持如 CPU、blkio、devices、pids、net_cls 等资源控制。 综合 Cgroups 的主要功能如下:
- 资源限制:对进程组使用的资源总额进行限制。
- 优先级分配:通过分配 CPU 时间片与硬盘 I/O,控制进程运行优先级。
- 资源统计: 统计进程、系统实际资源使用量。
- 进程控制:对进程组执行挂起、恢复等操作。
7.2.3 UnionFs 联合文件系统
联合文件系统(Union File System, UnionFs)它可以不同物理位置的目录合并、挂载到同一个目录中,而实际上目录的物理位置是分开的。UnionFs 把文件系统的每一次修改作为一个个层进行叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。如果一次同时加载多个文件系统,UnionFs 会把各层文件叠加起来,最终文件系统会包含所有底层文件和目录,从外部视角看,就是一个完成的文件系统。
容器镜像设计中,为了解决各类依赖以及依赖共享,正是利用 UnionFs 实现了镜像分层,再结合 bootfs、rootfs,一层层继承、叠加。启动容器时把相关的层挂载到一个目录,作为容器的根文件系统,这就是容器镜像的原理。
- bootfs(boot file system):包含操作系统 bootloader 和 kernel。用户不能修改 bootfs,在内核启动后,bootfs 会被卸载。
- rootfs(root file system):包含系统常见的目录结构,如/dev 、/lib、/proc、/bin、/etc/、/bin 等
0 评论