Docker 3 之 Docker 基本概念与架构

xiaoxiao2021-02-28  25

学习内容整理笔记来自 极客学院的 docker 入门教程,更多信息查看 Docker 文档

三. Docker 容器相关技术简介

Docker 容器依赖于 Linux 内核的两个重要特性

Namespaces 命名空间Control groups(Cgroups)控制组

了解这两个特性能够更好地帮助我们更好的理解 Docker 容器的资源分配和管理。


1.Namespaces 命名空间

很多编程语言都有命名空间的概念,可以认为命名空间是一种封装的概念。而封装本身实际上实现的就是代码隔离。那么,在操作系统中,命名空间提供了系统资源的隔离。其中,系统资源包括了进程、网络以及文件系统等等。实际上,Linux 内核实现命名空间的主要目的之一就是实现轻量级虚拟化服务(即所说的容器)。在同一个命名空间下的进程可以感知彼此的变化。而对其他命名空间下的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛它自己置身于一个独立的系统环境中。以此达到彼此独立和隔离的目的。

Docker 使用 5 种命名空间

PID (Process ID ):提供进程的隔离NET(Network):管理网络借口IPC(InterProcess Communication):管理跨进程通信的访问MNT(Mount):管理挂载点(即与文件系统相关的管理)UTS(Unix Timesharing System): 隔离内核和版本标识

2. Control groups 控制组

隔离的资源通过 Control groups 控制组进行管理

Cgroups(Control groups )是Linux 内核提供的一种可以限制, 记录, 隔离进程组 (process groups) 所使用的物理资源(如 CPU、Memory、IO 等等)的机制, 是将任意进程进行分组化管理的 Linux 内核功能。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。最初是由 google 工程师来提出并且在 2017 年的时候被 Linux Kernel 2.6.34@2007 整合进来。CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由 /proc/cgroup 来确认。

CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。

Linux 使用了多种数据结构在内核中实现了 cgroups 的配置,关联了进程和 cgroups 节点,那么 Linux 又是如何让用户态的进程使用到 cgroups 的功能呢? Linux内核有一个很强大的模块叫 VFS (Virtual File System)。 VFS 能够把具体文件系统的细节隐藏起来,给用户态进程提供一个统一的文件系统 API 接口。 cgroups 也是通过 VFS 把功能暴露给用户态的,cgroups 与 VFS 之间的衔接部分称之为 cgroups 文件系统。

Cgroups提供了以下功能:

限制进程组可以使用的资源数量(Resource limiting )。比如 memory 子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发 OOM(Out Of Memory)。进程组的优先级控制(Prioritization )。它可以设定哪些进程组使用更大的 CPU 或者是磁盘 IO 的资源。比如可以使用 CPU 子系统为某个进程组分配特定 CPU Share。记算进程组使用的资源数量(Accounting )。计算进程组使用多少系统资源,尤其是在计费系统中。比如可以使用 Cpuacct子系统记录某个进程组使用的cpu时间进程组隔离(Isolation)。比如使用 Ns子系统可以使不同的进程组使用不同的 Namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。进程组控制(Control)。它可以将进程组挂起和恢复。比如使用 Freezer 子系统可以将进程组挂起和恢复。

下面是常见的 cgroup 子系统

子系统作用blkio这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。cpu这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。cpuacct这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。cpuset这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。devices这个子系统可允许或者拒绝 cgroup 中的任务访问设备。freezer这个子系统挂起或者恢复 cgroup 中的任务。memory这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。net_cls这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 Cgroup 中生成的数据包。ns名称空间子系统。

Cgroup 相关概念解释

任务(Task)。在 Cgroups 中,任务就是系统的一个进程。控制族群(Control Group)。控制族群就是一组按照某种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用 Cgroups 以控制族群为单位分配的资源,同时受到 Cgroups 以控制族群为单位设定的限制。层级(Hierarchy)。控制族群可以组织成 Hierarchical 的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。子系统(Subsystem)。一个子系统就是一个资源控制器,比如 CPU 子系统就是控制 CPU 时间分配的一个控制器。子系统必须附加(Attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。

Cgroups 层级关系

相互关系

每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup,此 cgroup 在创建层级时自动创建,后面在该层级中创建的 cgroup 都是此 cgroup 的后代的初始成员。一个子系统最多只能附加到一个层级。一个层级可以附加多个子系统。一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;

系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup。

3. Docker 容器的能力

文件系统隔离:每个容器都有自己的 root 文件系统进程隔离:每个容器都运行在自己的进程环境中网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的资源隔离和分组:使用 Cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器
转载请注明原文地址: https://www.6miu.com/read-2400094.html

最新回复(0)