【虚拟化与容器技术】第1章 容器世界 —— 学习笔记
【虚拟化与容器技术】第1章 容器世界 —— 学习笔记 本文是我在学习《虚拟化与云计算技术》课程第一章容器世界后整理的学习笔记。内容主要基于教材结构结合自己在课堂上的理解和思考逐步梳理了虚拟化、容器、Docker 三者之间的关系。作为一个刚接触 Docker 的学生很多概念是在反复理解中才逐渐清晰的希望这篇笔记也能帮助和我一样的初学者理清脉络。1.1 了解虚拟化1.1.1 虚拟化概念虚拟化是一种资源管理技术刚接触虚拟化这个概念时我最初的理解比较朴素虚拟化就是把一台物理机分成好几台来用提高利用率。后来深入了解后才发现这个理解虽然方向没错但不够精确。虚拟化的核心思想是在物理硬件与使用者之间引入一个抽象层虚拟化层 / Hypervisor将真实的物理资源CPU、内存、存储、网络映射为若干个逻辑上独立的虚拟资源池。每个虚拟机看到的是一套完整、独立的计算环境但底层实际上共用同一套物理设备。这种抽象使得资源分配不再受物理边界限制可以按需切分、按需扩缩。那为什么说虚拟化是一种资源管理技术呢主要体现在以下几个方面维度说明提高资源利用率传统架构下一台服务器只跑一个系统CPU 利用率往往不足 20%。虚拟化允许在一台物理机上运行多个虚拟机整合碎片化的空闲资源动态调度与弹性分配虚拟化层可以实时监控各虚拟机的资源消耗动态调整 CPU 份额、内存分配等无需停机更换硬件隔离与多租户支持各虚拟机拥有独立地址空间和安全策略互不干扰可同时服务多个用户或业务资源池化与统一管理将多台物理服务器的资源汇聚为统一的资源池管理员面对一个逻辑视图即可统筹调配快速供给与生命周期管理创建虚拟机只需秒到分钟级支持即时创建、迁移、快照和销毁一个容易混淆的点是隔离和高效利用是虚拟化的两个不同目标。隔离本身是为了安全性和独立性——让不同虚拟机互不干扰而提升利用率的核心机制是资源的动态复用两者不能混为一谈。另外在理解虚拟化的资源分配时用动态调度比静态分区更准确。虚拟化并不是简单地把 CPU 切成几块、每块固定分给一个虚拟机而是当虚拟机 A 空闲时它的 CPU 时间片可以被临时借给虚拟机 B 使用资源是流动的而非静态划定的。小结虚拟化之所以被归类为资源管理技术根本原因在于它将物理资源从固定绑定变为逻辑可调——通过抽象、隔离、池化和动态调度四大机制实现了对计算资源在时间、空间和量级维度上的全面管控。云计算的弹性伸缩、按需付费等核心能力本质上都建立在虚拟化这一资源管理基础之上。1.1.2 硬件虚拟化硬件虚拟化是虚拟化技术中最核心也最成熟的领域。简单来说它通过 Hypervisor 在物理硬件上模拟出一套完整的虚拟硬件环境每个虚拟机都拥有独立的虚拟 CPU、虚拟内存、虚拟磁盘和虚拟网卡并在其上运行完整的操作系统。 这一节教材中有更多关于硬件虚拟化分类全虚拟化、半虚拟化、硬件辅助虚拟化等的内容本次学习中没有做深入展开后续有需要再补充。1.2 Docker 容器1.2.1 Docker 技术诞生Docker 诞生于 2013 年由 dotCloud 公司后改名为 Docker Inc.开源发布。它将 Linux 内核中已有的 Namespace 和 Cgroups 等隔离技术封装成简单易用的工具链并引入了镜像分层和标准化打包的设计理念使容器技术从运维人员的高阶技能变成了开发者的日常工具迅速改变了软件交付和部署的方式。1.2.2 容器与虚拟化这一部分是我在学习第一章时花时间最多的地方也是理解 Docker 的关键。容器技术和虚拟化技术的关系最初我对容器的认知是容器是基于虚拟化技术的是一种新型虚拟化。后来在深入学习中发现这个表述在学术上是有争议的。更准确的说法是容器是一种轻量级的操作系统级隔离技术而传统虚拟化是硬件级隔离技术两者的实现层次根本不同。传统虚拟机通过 Hypervisor 模拟完整硬件环境每个虚拟机运行一个完整的操作系统内核。容器不虚拟硬件直接共享宿主机的操作系统内核利用 Linux 的Namespace命名空间实现隔离和Cgroups控制组实现资源限制两个内核特性在进程层面划出独立的运行环境。两者的共同点在于都需要对运行的内容进行隔离形成独立的运行空间与宿主机系统相互独立、互不干扰。但隔离的层次完全不同——虚拟化是硬件级的系统隔离容器是操作系统进程级的隔离。为什么说容器的本质是进程级隔离这是我一开始比较困惑的一个点为什么说容器隔离的是程序进程理解的关键在于容器并不是一个微型操作系统它实际上就是宿主机上运行的一个或一组普通进程只不过这些进程被内核用两种机制加上了围栏Namespace命名空间限制进程的视野。让容器内的进程以为自己拥有独立的进程树、网络接口、文件系统挂载点和用户列表等。但这只是逻辑边界不是物理隔断。Cgroups控制组限制进程能使用的资源上限比如最多用多少 CPU 时间、多少内存。所以容器内运行的就是进程——容器内的应用进程和宿主机上的其他进程在内核眼中是同等级别的存在它们共用同一个内核的调度器和系统调用接口。容器没有自己的内核没有自己的硬件驱动。虚拟机与容器的对比在反复理解之后我整理出了以下对比帮助自己建立清晰的认知对比维度传统虚拟机容器隔离层次硬件级Hypervisor 模拟完整硬件操作系统进程级Namespace Cgroups是否有独立内核✅ 是每个 VM 有完整的 Guest OS 内核❌ 否共享宿主机内核包含内容应用 依赖库 完整操作系统应用 依赖库不含 OS 内核资源占用重每个 VM 都有完整 OS 的开销轻只含应用和依赖启动速度分钟级需加载内核、系统初始化秒级甚至毫秒级隔离强度强完全独立的内核和硬件抽象层相对弱共享内核内核漏洞可能影响全局典型工具VMware、KVM、Hyper-VDocker、Podman、containerd两者的架构差异可以更直观地表示为传统虚拟机架构 ┌──────────────────────────────────────────────┐ │ 物理硬件 │ │ └── Hypervisor虚拟化层 │ │ ├── VM1Guest OS内核 → 库 → 应用A │ │ ├── VM2Guest OS内核 → 库 → 应用B │ │ └── VM3Guest OS内核 → 库 → 应用C │ └──────────────────────────────────────────────┘ 容器架构 ┌──────────────────────────────────────────────┐ │ 物理硬件 │ │ └── 宿主机 OS 内核共享 │ │ └── 容器引擎Docker Engine 等 │ │ ├── 容器1库 → 应用A │ │ ├── 容器2库 → 应用B │ │ └── 容器3库 → 应用C │ └──────────────────────────────────────────────┘容器架构中少了为每个实例单独维护一个 OS 内核这一层这正是它轻便的根本原因。一个有趣的问题VM 里跑 Docker容器调用谁的内核在学习过程中我产生了一个疑问如果我在 VMware 的虚拟机里安装了 CentOS然后在 CentOS 里运行 Docker 容器那容器调用的是 CentOS 的内核还是物理宿主机的内核答案是调用 CentOS 的内核。因为对 Docker 容器来说它的宿主机就是运行 Docker 的那台机器——也就是这个 CentOS 虚拟机。容器内程序的调用链为容器内程序 → CentOS 内核 → VMware 虚拟硬件层 → 物理宿主机内核 → 物理硬件容器完全感知不到 VMware 和物理宿主机的存在它只和 CentOS 内核打交道。物理宿主机的内核在更底层工作——VMware Hypervisor 会拦截 CentOS 内核的硬件操作再转交给物理宿主机内核真正执行。这也解释了容器的跨平台限制容器共享宿主机内核所以 Linux 容器必须运行在 Linux 内核上。在 Windows 或 Mac 上使用 Docker Desktop 运行 Linux 容器时底层其实偷偷启动了一个轻量级 Linux 虚拟机来提供内核支持。⚡重要结论容器和虚拟机不是替代关系而是互补的。很多生产环境会在虚拟机内部再运行容器兼顾强隔离性和轻量部署的双重优势。1.2.3 Docker 优势教材总结了 Docker 的三大核心优势编排有序、高效易迁移、快速部署。一、编排有序编排在容器领域是一个专有概念指的是对多个容器的创建、调度、通信、扩缩容和生命周期管理进行统一协调。现代应用往往由数据库、后端服务、消息队列、缓存等多个组件构成。Docker 通过Docker Compose单机多容器编排和配合Kubernetes跨集群大规模编排可以用一份配置文件描述整个应用的拓扑结构——哪个容器先启动、容器之间如何通信、各自占用多少资源——然后一条命令让所有容器按照既定顺序协同运行避免了手动逐一管理的混乱。二、高效易迁移这一优势来源于容器的环境一致性和镜像分层机制。环境一致性Docker 将应用和完整运行环境打包成一个镜像无论迁移到哪台机器只要有 Docker Engine运行结果完全一致彻底解决了在我机器上能跑到你那里就出问题的经典难题。镜像分层机制Docker 镜像不是一个整体的压缩包而是由多个只读层Layer叠加而成的。每一层对应 Dockerfile 中的一条指令。最上层应用程序代码 ↑ 中间层安装的依赖库如 Python、Node.js ↑ 中间层基础软件包如 curl、vim ↑ 最底层基础操作系统文件系统如 Ubuntu、Alpine分层机制最精妙的地方是共享公共层。如果本地已有一个基于 Ubuntu 构建的镜像 A拉取另一个同样基于 Ubuntu 的镜像 B 时Docker 发现 Ubuntu 层已存在就直接复用只下载新增的差异层镜像AUbuntu层 Python层 应用A层 镜像BUbuntu层 Node.js层 应用B层 ↑ 这一层共享只需存储一份这样带来了三重好处存储占用降低多个镜像共享底层磁盘只保存一份下载速度更快已有的层直接跳过只传输差异层构建速度更快未变化的层使用缓存只重建改动部分此外镜像的所有层都是只读的。当容器启动时Docker 会在只读层顶部添加一个可写层容器运行期间的文件修改只发生在可写层中底层镜像保持不变。因此同一个镜像可以同时启动多个容器各自拥有独立的可写层互不干扰。三、快速部署传统虚拟机的启动需要经历 BIOS 自检、内核加载、系统初始化等完整流程往往需要数十秒到数分钟。而容器本质上只是在宿主机内核上启动一组受限进程启动时间可以压缩到秒级甚至毫秒级。这种快速部署能力在实际工程中意义重大弹性扩容流量突增时数秒内启动数十个新容器横向扩展故障自愈容器崩溃时编排系统立即销毁并重新拉起新实例对用户几乎无感知持续交付开发者提交代码后CI/CD 流水线可以快速构建镜像并部署到生产环境Docker 的集装箱思想Docker 的名字和 Logo一条鲸鱼背上驮着一堆集装箱都来源于集装箱这个隐喻。现实中集装箱解决的是货物形态各异每次换运输工具都要重新装卸。集装箱通过标准化封装让货物无论走海运、陆运还是空运都可以整箱转移不需要关心底层运输方式。Docker 解决的是完全对应的软件问题应用程序依赖的库、配置、运行时各不相同部署到不同环境总出问题。Docker 镜像就是集装箱——把应用和所有依赖一起密封打包无论目标环境是什么直接运行镜像即可得到一致结果。有一个细节值得注意集装箱思想强调的是用统一规格的标准容器去适配所有应用而不是为每种应用定制不同的箱子。底层运行环境Docker Engine只需要认识这一种标准格式就够了——这种标准先行才是集装箱革命的精髓。 Docker Logo 中的鲸鱼代表宿主机Docker Engine背上的每个小箱子就是一个运行中的容器直观地表达了一台主机上同时运行多个相互隔离的容器的核心概念。1.3 容器生态系统1.3.1 核心技术容器的核心技术主要围绕容器规范、容器运行时Runtime和容器管理工具展开。容器规范为了避免容器技术被单一厂商绑定业界制定了 OCIOpen Container Initiative标准规范了容器镜像格式和运行时行为。容器运行时如 runc、containerd负责真正创建和运行容器进程。容器管理工具如 Docker、Podman 等提供用户友好的命令行接口来管理镜像和容器。 关于 Docker 和 Podman 的区别Docker 依赖后台常驻的守护进程daemon来管理容器Podman 则是无守护进程daemonless设计每个容器作为独立进程运行在安全性上更有优势并且支持无根容器rootless container不需要 root 权限即可运行。1.3.2 平台技术容器平台技术主要解决的是容器在分布式环境中的集群管理问题。在容器普及之前企业为应对业务增长会将系统的不同模块分散部署在多台服务器上分布式部署但这带来了巨大的运维复杂度。容器平台技术如Kubernetes在此基础上扮演总调度员的角色功能说明调度决定每个容器运行在集群的哪个节点上自愈容器崩溃或节点故障时自动重新拉起容器伸缩根据负载自动增减容器实例数量服务发现让容器之间能够互相找到对方并通信负载均衡将外部请求均匀分发到多个容器实例简单来说容器编排平台使得大量容器可以作为一个整体集群在多台服务器构成的分布式环境中协调运行从而解决了大规模部署的管理难题。这也是容器技术从单机工具演进为云原生基础设施的关键一步。1.3.3 支持技术支持技术包括容器网络、容器存储、镜像仓库、CI/CD 集成等周边生态为容器在生产环境中的落地提供了完整的配套能力。 这部分内容在本次学习中没有深入讨论后续课程中应该会结合实验逐步展开。1.4 本章小结通过第一章的学习我逐步理清了虚拟化 → 容器 → Docker这条技术演进脉络以下是几个核心收获虚拟化是一种资源管理技术通过抽象层将物理资源转化为可按需分配的逻辑资源池实现了资源的高效利用、动态调度和隔离管控。容器不等于虚拟机的轻量版两者的隔离层次本质不同——虚拟机是硬件级隔离有独立内核容器是进程级隔离共享宿主内核因此容器更轻便但隔离性相对较弱。Docker 的核心价值在于标准化封装通过集装箱思想将应用及其依赖打包成统一格式的镜像实现一次构建到处运行的环境一致性。镜像的分层机制是 Docker 高效的底层支撑——共享公共层降低存储和传输开销只读层 可写层的设计保证了镜像的不可变性和容器间的独立性。容器和虚拟机是互补关系生产环境中常见虚拟机套容器的架构兼顾强隔离和轻量部署。作为初学者我觉得最大的收获是理解了容器的本质就是被 Namespace 和 Cgroups 限制了视野和资源的进程这一点。有了这个认知基础后续学习 Docker 的镜像操作、容器管理和网络配置时就不容易被表象迷惑了。✍️作者说明本文为课程学习笔记基于教材第一章内容和课堂学习过程中的理解整理而成。如有不准确之处欢迎指正交流。教材《虚拟化与云计算技术》环境VMware openEuler / CentOS Docker