Docker 架构与核心原理深度解析:容器到底是怎么实现的?

Docker 架构与核心原理深度解析:容器到底是怎么实现的?

很多人把 Docker 理解为“轻量级虚拟机”。
这是一个非常不严谨的说法。

Docker 本身并不是容器技术的创造者,它只是把 Linux 内核已有的能力工程化、产品化。要理解 Docker,必须回到内核层面。

本文将从以下几个方面展开:

  1. 容器与虚拟机的本质区别
  2. Namespace 隔离机制
  3. Cgroups 资源控制
  4. UnionFS 分层文件系统
  5. Docker Engine 架构解析
  6. Docker 与 containerd 的关系

一、容器 vs 虚拟机:本质差异

虚拟机依赖 Hypervisor,在物理机上虚拟出完整硬件环境,每个虚拟机都运行一个完整的 Guest OS。

典型架构如下:

物理机 → Hypervisor → Guest OS → 应用

而容器架构则是:

物理机 → Host OS → 容器(共享内核)→ 应用

关键差异在于:容器共享宿主机内核。

这带来三点核心影响:

  1. 启动速度快(无需启动完整 OS)
  2. 资源开销小
  3. 隔离强度依赖内核机制

Docker 只是将 Linux 提供的隔离与资源控制能力封装成可操作的接口。


二、Namespace:进程隔离的核心机制

Namespace 是 Linux 内核提供的资源隔离机制。
每个容器运行在独立的 Namespace 中。

常见类型:

  • pid:进程隔离
  • net:网络栈隔离
  • mnt:文件系统挂载点隔离
  • uts:主机名隔离
  • ipc:进程通信隔离
  • user:用户映射隔离

举例说明:

当容器内执行 ps aux 时,你看到的只是当前 pid namespace 下的进程,而不是宿主机全部进程。

这意味着:

容器本质上是一组被隔离的进程,而不是一台“虚拟机器”。

这也是容器轻量化的根本原因。


三、Cgroups:资源控制的底层实现

隔离不等于限制。

Namespace 解决“看不见”,Cgroups 解决“用多少”。

Cgroups(Control Groups)用于限制:

  • CPU 使用率
  • 内存使用
  • IO 带宽
  • 进程数量
  • 网络带宽

当你执行:

docker run -m 512m --cpus=1 nginx

本质上是 Docker 在底层创建了对应的 cgroup 控制组,并将容器进程加入该组。

在 Kubernetes 体系中,容器资源限制依然依赖 Cgroups。


四、UnionFS:镜像分层的关键

Docker 镜像之所以体积小、可复用,是因为采用了分层文件系统。

常见实现包括:

  • aufs(早期)
  • overlay2(主流)

UnionFS 的核心思想:

多层只读层 + 一层可写层

每次 Dockerfile 中执行一条指令,就会生成一个新的镜像层。

例如:

FROM ubuntu
RUN apt update
RUN apt install nginx

会产生多个 layer。

容器运行时:

底层镜像只读
最上层添加一层可写层(copy-on-write)

这使得:

  1. 镜像可以复用
  2. 传输效率高
  3. 构建速度快

但也带来一个问题:

层数过多会导致镜像体积膨胀。


五、Docker Engine 架构解析

Docker 的整体架构可以拆分为三部分:

  1. CLI
  2. REST API
  3. daemon

工作流程如下:

docker run → CLI → REST API → dockerd → containerd → runc

核心组件包括:

  • dockerd:守护进程
  • containerd:容器运行管理
  • runc:真正创建容器的低级运行时

这里涉及一个重要组织:

Open Container Initiative

OCI 制定了容器运行时标准。

Docker 后期将底层运行时抽象为符合 OCI 标准的结构,使得 runc 成为标准实现。


六、Docker 与 containerd 的关系

早期 Docker 是一个大而全的系统。

后来架构拆分:

  • Docker 负责镜像管理、构建、CLI
  • containerd 负责容器生命周期管理
  • runc 负责真正调用内核接口

Kubernetes 在 1.24 版本之后移除了 dockershim,直接对接 containerd。

这说明:

Docker 更像一个“开发者工具平台”,
containerd 才是纯粹的容器运行时。


七、总结:Docker 本质是什么?

Docker 不是虚拟机技术。
它是:

Namespace + Cgroups + UnionFS + OCI 标准 的工程整合。

换句话说:

容器不是一个“迷你操作系统”,
它只是被精细隔离与控制的一组进程。

理解这一点,后面学习:

  • 容器网络
  • 容器存储
  • Kubernetes 调度
  • 资源限制

都会变得非常清晰。

Read more

[Python] 进阶之路:模块、包和异常处理

[Python] 进阶之路:模块、包和异常处理

在掌握了Python的类与对象后,下一步是深入理解模块化开发和异常处理。模块与包帮助我们组织代码,增强代码的可维护性和重用性,而异常处理则是编写健壮代码的重要技能。本文将系统讲解Python中模块、包和异常处理的核心概念与实用技巧。 一、模块:代码组织的基本单位 1.1 什么是模块? 模块(Module)是Python中用于组织代码的基本单位,一个.py文件就是一个模块。通过模块,我们可以将相关功能的代码放在一起,便于重用和维护。 例如,一个名为math_utils.py的模块可能包含一些数学相关的函数: # math_utils.pydefadd(a, b):return a + b defsubtract(a, b):return a - b 1.2 如何导入模块? Python使用import关键字导入模块。以下是常见的导入方式: # 导入整个模块import math_utils print(math_

By Ne0inhk

关于 ComfyUI 的 Windows 本地部署系统环境教程(详细讲解Windows 10/11、NVIDIA GPU、Python、PyTorch环境等)

在本地部署 ComfyUI 时,确保 Python、PyTorch、CUDA 等组件的版本能完美匹配,这对避免安装报错和保证稳定运行至关重要。 以下内容是整合了一份核心组件的版本适配对照表,并配上不同显卡的配置建议,希望能帮助你顺利部署。 一、准备阶段 1. 系统与硬件确认 * 确保你的系统为 Windows 10 或更高版本。 * 拥有一块 NVIDIA 显卡(最好支持较新 CUDA 架构)。 * 显存建议至少 6-8 GB,如果你要做高清、大分辨率或多插件 (ControlNet/LoRA) 的生成,建议 12 GB 以上。 * NVIDIA 驱动建议更新为与所选 CUDA 版本兼容的最新驱动。 * 你可运行 nvidia-smi 在终端查看当前驱动版本及支持的 CUDA 最高版本。 * 硬盘建议为 SSD,并有充足可用空间(

By Ne0inhk

07 - 使用IDEA开发Python

文章目录 * 安装Python插件 * Python Community Edition插件 * 配置 `Python SDK` * 添加 `Python SDK` * 管理解释器类路径 * 查看路径 * 添加路径 * 删除路径 * 移除 `Python SDK` * 配置虚拟环境 * 配置 `virualenv` 虚拟环境: * 配置 `conda` 虚拟环境 * 配置 `pipenv` 虚拟环境 * 配置 `Poetry` 虚拟环境 * 配置 `uv` 虚拟环境 * 创建Python项目 * 安装项目所需的包 * 编写和运行Python代码 * 部署Python项目 以前的文章中介绍了如何安装了Python,到此,如果你对Python特别熟悉,可以不依赖于开发额外的开发IDE,直接使用包/环境管理工具和文本编辑器就可以开发Python工程项目。但是开发IDE在开发过程会提供更多便捷方式如管理工具集成、代码高亮、代码提示等,方便开发人员开发、管理、编译、

By Ne0inhk