mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-10-19 09:36:13 +00:00
按本书自己的多数体例收口,不是引入新规范;同批在集群 14 本书上做同一件事。 **中英文空格**:改动前 8753 处已空格 : 36 处紧贴(0.4%),改动后紧贴 **0**。只在「汉字 ↔ 拉丁字母/数字」直接相邻处插一个半角空格;不动中文标点与拉丁字符之间、也不动半角括号与中文之间。 脚本用私用区字符遮蔽围栏代码、行内代码、`$$…$$` 公式、链接与图片目标、HTML 标签、裸 URL、引用式链接定义与 YAML front matter 之后再改。 验证:改动前后各自抹掉全部空白与两种圆括号后**逐字节相同**;左右括号总数守恒;逐行比对无一行新增连续多空格;SUMMARY 目录名与文件标题的一致数改动前后不变。`check_project_rules`、`check_emphasis`、根 `format_checker`、`validate_codeblocks`、`scan_secrets` 全绿,测试套失败集合与改动前一致。
第十二章 底层实现
Docker 底层的核心技术包括 Linux 上的命名空间 (Namespaces)、控制组 (Control groups)、Union 文件系统 (Union file systems) 和容器格式 (Container format)。
我们知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。 这种直接的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。 例如,以宿主机和虚拟机系统都为 Linux 系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。
我们知道,在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU 等等,所有的资源都是应用进程直接共享的。 要想实现虚拟化,除了要实现对内存、CPU、网络 IO、硬盘 IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC 等等的相互隔离。 前者相对容易实现一些,后者则需要宿主机系统的深入支持。
随着 Linux 系统对于命名空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的命名空间中运行。大家虽然都共用一个内核和某些运行时环境(例如一些系统命令和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器 (Container),利用命名空间来做权限的隔离控制,利用 cgroups 来做资源分配。