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

我的世界国际Java版1.21.4/基岩版1.12.62免费下载&&安装(PC端)及其游戏相关教程

我的世界国际Java版1.21.4/基岩版1.12.62免费下载&&安装(PC端)及其游戏相关教程

本文提供了我的世界国际Java版和基岩版的免费下载和安装教程,并附带模组相关教程。 写在前面 2019年5月,我的世界成为了有史以来全球最畅销的电子游戏,也成为了全球最受欢迎的游戏之一。因此,作者始终支持且鼓励各位进行正版游戏。 值得注意的是,通过此教程安装的我的世界不能进行除局域网以外的联机游戏,若想进行联机,请: * 购买我的世界国际Java/基岩版,请前往 Minecraft:Java 版和 Bedrock 版(电脑端) https://www.minecraft.net/zh-hans/store/minecraft-deluxe-collection-pc?tabs=%7B%22details%22:0%7D * 免费下载/安装我的世界中国版(网易我的世界),请前往 我的世界-新篇章 https://mc.163.com/ 下载并安装我的世界Java版 我的世界Java版是Minecraft的原始平台,可以在Windows、macOS和Linux上运行,但必须通过启动器启动。 目前,Java版的最新版本为1.

By Ne0inhk

Java常见面试题及答案汇总(2025持续更新)

Java 作为企业级开发的主流语言,面试时涉及的知识点广泛且深入。本文整理了 Java 基础、集合、多线程、JVM、Spring、数据库、分布式 等高频面试题,并附上详细解析,帮助大家高效备战面试! 📚 一、Java 基础 1. Java 的三大特性是什么? ✅ 答案: * 封装:隐藏对象的属性和实现细节,仅对外提供访问方式(getter/setter)。 * 继承:子类继承父类的属性和方法,提高代码复用性。 * 多态:同一方法在不同对象上有不同行为(方法重写、接口实现)。 2. == 和 equals() 的区别? ✅ 答案: * ==:比较基本数据类型的值,或引用类型的内存地址。 * equals():默认比较对象地址(Object类),但可被重写(如 String 比较内容)。 3. String、

By Ne0inhk
Java 应用程序已被安全阻止 —— 原因分析与解决方案

Java 应用程序已被安全阻止 —— 原因分析与解决方案

一、问题现象 在启动 Java KVM / Java Web Start 应用时,弹出如下提示: 应用程序已被 Java 安全阻止 出于安全原因,应用程序现在必须满足“高”或“非常高”安全设置的要求或属于“例外站点列表”的一部分才能允许运行。 名称:com.kvm.viewer.Viewer 位置:https://*** 原因:您的安全设置已阻止已签名的应用程序运行 此时: * 没有“继续 / 运行”按钮 * 无法通过自动化(Playwright、PyJAB 等)绕过 * 应用直接被终止 二、这是 Java 安全机制的“硬阻断” 这不是程序 bug,也不是自动化工具的问题,而是

By Ne0inhk
Java的JDK下载与安装

Java的JDK下载与安装

目录 第一步:Windows的java jdk的配置 https://www.oracle.com/java/technologies/downloads 第二步:安装jdk,下载完成后双击打开安装jdk(傻瓜式安装) 第三步:重点!配置系统的环境变量 第四步:验证Java环境变量是否配置成功 第一步:Windows的java jdk的配置  链接: https://www.oracle.com/java/technologies/downloads  下图是通过网址下载的步骤,先看自己电脑的系统类型,查看电脑是x86还是x64系统的方法: 点击对应的安装包下载按钮,需要勾选上面的框框,不然没法下载 第二步:安装jdk,下载完成后双击打开安装jdk(傻瓜式安装) 只需要点击下一步进行安装,如需更改安装路径,点击“更改”到指定目录,记好文件的路径安装,安装结束,点击关闭即可。安装好jdk后,

By Ne0inhk