【虚拟化与容器技术】第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-V Docker、Podman、containerd

两者的架构差异可以更直观地表示为:

复制代码
传统虚拟机架构:
┌──────────────────────────────────────────────┐
│              物理硬件                         │
│  └── Hypervisor(虚拟化层)                   │
│        ├── VM1:Guest OS内核 → 库 → 应用A     │
│        ├── VM2:Guest OS内核 → 库 → 应用B     │
│        └── VM3:Guest 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 层已存在,就直接复用,只下载新增的差异层:

复制代码
镜像A:Ubuntu层 + Python层 + 应用A层
镜像B:Ubuntu层 + Node.js层 + 应用B层
            ↑
       这一层共享,只需存储一份

这样带来了三重好处:

  • 存储占用降低:多个镜像共享底层,磁盘只保存一份
  • 下载速度更快:已有的层直接跳过,只传输差异层
  • 构建速度更快:未变化的层使用缓存,只重建改动部分

此外,镜像的所有层都是只读的 。当容器启动时,Docker 会在只读层顶部添加一个可写层,容器运行期间的文件修改只发生在可写层中,底层镜像保持不变。因此同一个镜像可以同时启动多个容器,各自拥有独立的可写层,互不干扰。

三、快速部署

传统虚拟机的启动需要经历 BIOS 自检、内核加载、系统初始化等完整流程,往往需要数十秒到数分钟。而容器本质上只是在宿主机内核上启动一组受限进程,启动时间可以压缩到秒级甚至毫秒级

这种快速部署能力在实际工程中意义重大:

  • 弹性扩容:流量突增时,数秒内启动数十个新容器横向扩展
  • 故障自愈:容器崩溃时,编排系统立即销毁并重新拉起新实例,对用户几乎无感知
  • 持续交付:开发者提交代码后,CI/CD 流水线可以快速构建镜像并部署到生产环境
Docker 的集装箱思想

Docker 的名字和 Logo(一条鲸鱼背上驮着一堆集装箱)都来源于"集装箱"这个隐喻。

现实中,集装箱解决的是:货物形态各异,每次换运输工具都要重新装卸。集装箱通过标准化封装,让货物无论走海运、陆运还是空运,都可以整箱转移,不需要关心底层运输方式。

Docker 解决的是完全对应的软件问题:应用程序依赖的库、配置、运行时各不相同,部署到不同环境总出问题。Docker 镜像就是"集装箱"------把应用和所有依赖一起密封打包,无论目标环境是什么,直接运行镜像即可得到一致结果。

有一个细节值得注意:集装箱思想强调的是用统一规格的标准容器去适配所有应用,而不是为每种应用定制不同的"箱子"。底层运行环境(Docker Engine)只需要认识这一种标准格式就够了------这种"标准先行"才是集装箱革命的精髓。

🐳 Docker Logo 中的鲸鱼代表宿主机(Docker Engine),背上的每个小箱子就是一个运行中的容器,直观地表达了"一台主机上同时运行多个相互隔离的容器"的核心概念。


1.3 容器生态系统

1.3.1 核心技术

容器的核心技术主要围绕容器规范、容器运行时(Runtime)和容器管理工具展开。

  • 容器规范:为了避免容器技术被单一厂商绑定,业界制定了 OCI(Open 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 这条技术演进脉络,以下是几个核心收获:

  1. 虚拟化是一种资源管理技术,通过抽象层将物理资源转化为可按需分配的逻辑资源池,实现了资源的高效利用、动态调度和隔离管控。

  2. 容器不等于虚拟机的"轻量版",两者的隔离层次本质不同------虚拟机是硬件级隔离(有独立内核),容器是进程级隔离(共享宿主内核),因此容器更轻便但隔离性相对较弱。

  3. Docker 的核心价值在于标准化封装,通过集装箱思想将应用及其依赖打包成统一格式的镜像,实现"一次构建,到处运行"的环境一致性。

  4. 镜像的分层机制是 Docker 高效的底层支撑------共享公共层降低存储和传输开销,只读层 + 可写层的设计保证了镜像的不可变性和容器间的独立性。

  5. 容器和虚拟机是互补关系,生产环境中常见"虚拟机套容器"的架构,兼顾强隔离和轻量部署。

作为初学者,我觉得最大的收获是理解了"容器的本质就是被 Namespace 和 Cgroups 限制了视野和资源的进程"这一点。有了这个认知基础,后续学习 Docker 的镜像操作、容器管理和网络配置时,就不容易被表象迷惑了。


✍️ 作者说明: 本文为课程学习笔记,基于教材第一章内容和课堂学习过程中的理解整理而成。如有不准确之处,欢迎指正交流。

教材:《虚拟化与云计算技术》

环境: VMware + openEuler / CentOS + Docker

相关推荐
L1624762 小时前
Docker 全维度学习指南(从入门到实战)
运维·docker·容器
中国IT2 小时前
第5章:Docker 的image镜像管理
运维·docker·容器
阿梦Anmory2 小时前
快速部署Milvus 2.6.4单机版向量数据库(Docker Compose方式)
数据库·docker·milvus
逻极2 小时前
深入剖析Docker核心架构:从组件交互到内核原理详解
docker·系统架构·linux内核·devops·容器技术
赵文宇(温玉)2 小时前
OpenClaw-In-Docker安全、独立、便捷的OpenClaw部署运行方案,已在Github开源
安全·docker·github
fanjinhong_85212 小时前
Docker 镜像与容器关系解析
linux·docker
升职佳兴2 小时前
Docker 安装、镜像管理与 Dockerfile 构建实战(openEuler 版)
运维·docker·容器
芥子沫2 小时前
提示词管理工具推荐prompt-manage,Docker一键部署和使用指南
docker·容器·prompt·提示词
TeamDev2 小时前
使用 Docker 部署 DotNetBrowser 应用程序
运维·ui·docker·容器·桌面应用·dotnet·dotnetbrowser