{"name":"容器化","id":"操作系统-容器化","content":"# 容器化\n\n## 一、容器的第一性原理\n\n### 1.1 容器是什么（本质定义）\n\n**容器不是虚拟机，不是轻量级 OS，而是一组受约束的进程集合。**\n\n> 容器 = 进程 + 受限视图 + 受控资源 + 安全策略\n\n其成立依赖一个根本事实：\n\n> **操作系统本身就是资源管理与隔离系统**。\n\nLinux 内核早已具备：\n\n* 资源分配能力（CPU / 内存 / IO）\n* 访问边界控制能力（进程 / 文件 / 网络）\n\n容器化只是将这些能力**组合、产品化、标准化**。\n\n---\n\n### 1.2 为什么容器不需要“虚拟硬件”\n\n| 对比维度   | 虚拟机   | 容器    |\n| ------ | ----- | ----- |\n| 虚拟化层级  | 硬件层   | 操作系统层 |\n| 是否包含内核 | 是     | 否     |\n| 隔离对象   | OS 实例 | 进程视图  |\n| 资源开销   | 高     | 低     |\n\n**关键差异并不在“轻量”，而在“抽象层级”。**\n\n* VM 复制了一套“机器”\n* 容器复用了一套“操作系统”，只隔离“使用方式”\n\n---\n\n## 二、容器系统的统一抽象模型\n\n### 2.1 容器的五大构成要素\n\n```text\n┌─────────────────────────────────┐\n│            Container             │\n│ ┌──────────────┐ ┌────────────┐ │\n│ │ 视图隔离     │ │ 资源控制   │ │\n│ │ Namespace    │ │ Cgroups    │ │\n│ └──────────────┘ └────────────┘ │\n│ ┌────────────────────────────┐ │\n│ │ 文件系统视图（rootfs）     │ │\n│ └────────────────────────────┘ │\n│ ┌────────────────────────────┐ │\n│ │ 进程模型（PID 1 / 信号）   │ │\n│ └────────────────────────────┘ │\n│ ┌────────────────────────────┐ │\n│ │ 安全策略（Caps / UserNS）  │ │\n│ └────────────────────────────┘ │\n└─────────────────────────────────┘\n```\n\n容器并非单一技术，而是**多个内核子系统的协作结果**。\n\n---\n\n### 2.2 稳定知识与易变知识分层\n\n| 层级    | 内容                 | 稳定性 |\n| ----- | ------------------ | --- |\n| 第一性原理 | 进程隔离、资源分配          | 极高  |\n| 架构模式  | Namespace + Cgroup | 高   |\n| 内核机制  | CFS、OOM、OverlayFS  | 中   |\n| 实现工具  | Docker / CRI       | 低   |\n\n本文聚焦前两层，第三层作为支撑，第四层仅作示例。\n\n---\n\n## 三、视图隔离：Namespace 的设计哲学\n\n### 3.1 Namespace 的本质\n\n> **Namespace 不是“安全机制”，而是“视图重映射机制”。**\n\n它回答的问题是：\n\n> “这个进程**能看到什么**？”\n\n而不是：\n\n> “这个进程**能做什么**？”\n\n---\n\n### 3.2 Namespace 的分类抽象\n\n| Namespace | 隔离对象  | 设计目的   |\n| --------- | ----- | ------ |\n| PID       | 进程号空间 | 进程树独立  |\n| Mount     | 文件系统  | 路径视图独立 |\n| Network   | 网络栈   | 网络拓扑独立 |\n| UTS       | 主机标识  | 系统身份独立 |\n| IPC       | 进程通信  | 通信边界   |\n| User      | 用户身份  | 权限映射   |\n\n**它们共同完成：对“同一内核，不同世界”的构造。**\n\n---\n\n## 四、资源控制：Cgroups 的系统模型\n\n### 4.1 Cgroups 的第一性原理\n\n> **资源不是无限的，必须被公平、可控地分配。**\n\nCgroups 解决的问题是：\n\n* 一个进程组\n* 最多能用多少资源\n* 超出时系统如何退化\n\n---\n\n### 4.2 Cgroups 的设计模式\n\n| 子系统    | 控制维度      | 核心哲学    |\n| ------ | --------- | ------- |\n| CPU    | 时间片       | 公平 + 上限 |\n| Memory | 页面        | 生存优先    |\n| IO     | 带宽 / IOPS | 系统整体稳定  |\n\nCgroups **不追求性能最大化，而追求系统可预测性**。\n\n---\n\n### 4.3 v1 → v2 的演进逻辑\n\nv2 的本质变化不是 API，而是：\n\n> **从“子系统视角”转为“进程组视角”**\n\n* v1：一个进程属于多个 group\n* v2：一个进程属于一个 group\n\n这使资源治理逻辑更加一致、可组合。\n\n---\n\n## 五、容器的进程模型\n\n### 5.1 PID 1 的系统含义\n\n在容器中，PID 1 并不是普通进程，而是：\n\n* 信号接收者\n* 子进程回收者\n* 生命周期锚点\n\n> **一个不正确的 PID 1，会导致整个容器的资源泄露。**\n\n---\n\n### 5.2 信号与退出的设计哲学\n\n* SIGTERM：协作式退出\n* SIGKILL：系统兜底\n\n容器停止 = **对“进程树”的有序拆解**，而非简单 kill。\n\n---\n\n## 六、文件系统视图：rootfs 与分层\n\n![2022122413485](/assets/2022122413485.webp)\n\n### 6.1 rootfs 的本质\n\n> rootfs 不是 OS，而是：\n> **进程运行所需最小文件视图集合**。\n\n容器镜像 ≠ 操作系统\n容器镜像 = 运行时依赖快照\n\n---\n\n### 6.2 分层与 Copy-on-Write 的哲学\n\n分层设计解决的不是功能问题，而是：\n\n* 存储复用\n* 构建效率\n* 分发成本\n\n这是**工程规模问题的系统性解法**。\n\n---\n\n## 七、网络：性能、隔离与复杂性的权衡\n\n### 7.1 Network Namespace 的抽象\n\nNetwork Namespace = 一套完整的网络协议栈视图。\n\n容器网络的复杂性来自：\n\n> **既要隔离，又要互通。**\n\n---\n\n### 7.2 网络方案的权衡模型\n\n| 方案      | 优势  | 代价      | 适用  |\n| ------- | --- | ------- | --- |\n| veth    | 通用  | softirq | 默认  |\n| macvlan | 高性能 | 无 NAT   | 高吞吐 |\n| Overlay | 跨主机 | 封包      | 云环境 |\n| BGP     | 原生  | 运维复杂    | 大规模 |\n\n---\n\n## 八、安全模型：边界而非绝对隔离\n\n### 8.1 容器安全的核心事实\n\n> **容器安全 ≠ VM 级安全**。\n\n它依赖：\n\n* 权限最小化\n* 攻击面缩减\n* 信任边界清晰\n\n---\n\n### 8.2 User Namespace 与 Rootless 的意义\n\n这是容器安全演进中最关键的一步：\n\n> **将“root”变成一种相对概念。**\n\n---\n\n## 九、编排系统的抽象价值\n\n容器编排系统并不关心“怎么跑进程”，而关心：\n\n* 系统如何自愈\n* 资源如何整体调度\n* 服务如何持续可用\n\nKubernetes 是：\n\n> **分布式操作系统的控制平面雏形**。\n\n---\n\n## 十、容器化的长期工程哲学\n\n### 10.1 三个不可违背的原则\n\n1. **最小化原则**\n\n   * 权限最小\n   * 镜像最小\n   * 能力最小\n\n2. **可观测性优先**\n\n   * 资源可见\n   * 行为可追踪\n\n3. **失败是常态**\n\n   * OOM 会发生\n   * 重启是设计的一部分\n\n## 关联内容（自动生成）\n\n- [/操作系统/虚拟化.md](/操作系统/虚拟化.md) 虚拟化与容器化是两种不同的资源隔离技术，文档详细介绍了虚拟化的基本概念、技术实现和与容器化的关系\n- [/操作系统/linux/内核.md](/操作系统/linux/内核.md) Linux内核中的namespace和cgroup机制是容器化技术的基础，文档深入解析了这些内核机制的实现原理\n- [/计算机网络/Linux虚拟化.md](/计算机网络/Linux虚拟化.md) Linux网络虚拟化技术与容器网络密切相关，特别是namespace、veth、bridge等技术在容器网络中的应用\n- [/运维/Docker.md](/运维/Docker.md) Docker是容器化技术的典型实现，文档介绍了Docker的架构、使用方法以及与底层Linux内核机制的关系\n- [/运维/K8s.md](/运维/K8s.md) Kubernetes是容器编排系统的代表，文档阐述了如何通过Kubernetes管理大规模容器化应用\n- [/软件工程/架构/系统设计/云原生.md](/软件工程/架构/系统设计/云原生.md) 云原生架构与容器化技术密切相关，文档探讨了容器化如何改变应用的开发、部署和运维模式\n- [/操作系统/安全.md](/操作系统/安全.md) 容器化环境下的安全模型与传统操作系统安全有相似之处，都涉及资源隔离与权限管理\n- [/计算机网络/云计算.md](/计算机网络/云计算.md) 云计算环境大量使用容器化技术来实现资源的弹性分配和隔离，文档中的虚拟化技术与容器化有密切关系\n","metadata":"tags: ['分布式系统', '操作系统', '隔离技术']","hasMoreCommit":false,"totalCommits":10,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2025-12-29T15:24:18+08:00","author":"MY","message":"docs(操作系统): 完善容器化技术文档，补充容器原理和架构模型","hash":"bc0e543650fb0286b6214d872b41f456e3124d6f"},{"date":"2024-11-27T16:25:26+08:00","author":"MY","message":"📦容器化","hash":"e562244320baadb10ffbe0aef6ff9679da0f475a"},{"date":"2024-03-07T20:07:34+08:00","author":"MY","message":"✏容器化 & k8s","hash":"dccd2fb3946bf2797a63da6f122854483ebb779d"},{"date":"2022-12-27T17:24:40+08:00","author":"cjiping","message":"✏️容器化","hash":"0dc5ace96fb1f21849fd248902288c55830efc42"},{"date":"2022-12-26T17:54:48+08:00","author":"cjiping","message":"✏️容器化","hash":"97da110d3e151098e72081047629fa3715612c30"},{"date":"2022-12-25T14:32:55+08:00","author":"MY","message":"✏️容器化","hash":"03adcface76c8fcda1f824c043df87aac04c0295"},{"date":"2022-12-24T14:00:03+08:00","author":"MY","message":"✏️容器化","hash":"975790db3f1bba6c6b32ad2a42ffd68be431ebf2"},{"date":"2022-12-23T16:00:32+08:00","author":"cjiping","message":"✏️容器化","hash":"0b3eb32e06109fd7c2bcc8b8d2d704e3c608cd16"},{"date":"2022-12-22T18:20:31+08:00","author":"cjiping","message":"➕容器化","hash":"eedd975ac04eabb70eaaea543ea2dd1dc8e20808"}],"createTime":"2022-12-22T18:20:31+08:00"}