架构原理”、“镜像与容器生命周期”、“网络与存储” 这三大支柱展开。

三大核心:容器、镜像、仓库

Docker 的完整运行依赖三大基石(Namespace、Cgroups、UnionFS(联合文件系统))

一、Docker 与虚拟机的区别?即docker与kvm的区别

💡 形象比喻

  • KVM (虚拟机) 就像是 独栋别墅**。**

    • 每栋别墅都有自己的地基、水管、电路、厨房(独立内核)。

    • 你想住进去,得先把房子盖好(启动慢)。

    • 邻居着火了很难烧到你(隔离性好)。

    • 但是占地大,成本高。

  • Docker (容器) 就像是 胶囊旅馆的隔间**。**

    • 大家共享大楼的地基、总水管、总电路(共享内核)。

    • 你只需要拎包入住(启动极快)。

    • 空间利用率极高,一栋楼能住很多人。

    • 但如果大楼地基(内核)塌了,所有人都得遭殃;隔音效果也没别墅好(隔离性稍弱)。

1、核心架构区别 (最本质的不同)

维度

KVM (虚拟机)

Docker (容器)

启动速度

慢 (分钟级)。 需要经历完整的 BIOS 自检、内核加载、系统初始化过程。

极快 (秒级/毫秒级)。 本质是启动一个进程,无需加载内核。

资源开销

大。 每个 VM 都要占用几百 MB 甚至几 GB 内存来运行完整的操作系统内核和系统服务。

极小。 只有应用本身及其依赖库的内存占用,几乎没有额外损耗。

性能损耗

有损耗。 I/O 和网络需要经过 Hypervisor 转换,损耗约 5%-15%。

接近原生。 直接调用宿主机内核,损耗几乎可以忽略不计 (<1%)。

密度

低。 一台物理机可能只能跑几十个 VM。

高。 一台物理机可以跑成千上万个容器。

2、性能与资源对比

维度

KVM (虚拟机)

Docker (容器)

启动速度

慢 (分钟级)。 需要经历完整的 BIOS 自检、内核加载、系统初始化过程。

极快 (秒级/毫秒级)。 本质是启动一个进程,无需加载内核。

资源开销

大。 每个 VM 都要占用几百 MB 甚至几 GB 内存来运行完整的操作系统内核和系统服务。

极小。 只有应用本身及其依赖库的内存占用,几乎没有额外损耗。

性能损耗

有损耗。 I/O 和网络需要经过 Hypervisor 转换,损耗约 5%-15%。

接近原生。 直接调用宿主机内核,损耗几乎可以忽略不计 (<1%)。

密度

低。 一台物理机可能只能跑几十个 VM。

高。 一台物理机可以跑成千上万个容器。

3. 隔离性与安全性

维度

KVM (虚拟机)

Docker (容器)

隔离级别

强隔离。 完全独立的操作系统,一个 VM 崩溃或中毒通常不影响其他 VM 或宿主机。

进程级隔离。 共享内核,如果内核出现漏洞,所有容器都可能受影响;一个容器耗尽资源可能影响宿主机(虽有 Cgroups 限制,但风险略高于 VM)。

安全性

高。 适合运行不可信代码或多租户环境。

中。 适合运行可信的应用微服务。不建议在容器中运行完全不可信的恶意代码。

系统兼容性

高。 可以在 Linux 宿主机上跑 Windows VM,或者跑不同版本内核的 Linux。

低。 Linux 容器必须依赖 Linux 内核。 (注:Windows 上跑 Docker 是通过 Hyper-V 起了一个 Linux VM 来容纳容器的)

4、镜像与管理

维度

KVM (虚拟机)

Docker (容器)

镜像大小

大 (GB 级)。 包含完整的操作系统文件。

小 (MB 级)。 只包含应用和依赖库,分层存储。

传输与分发

慢,难以版本控制。

快,支持分层增量更新,易于 CI/CD 流水线集成。

状态持久性

通常被视为“宠物” (Pet),长期运行,状态保存在磁盘。

通常被视为“牲畜” (Cattle),无状态,随时销毁重建,数据挂载卷存储。

🚀 总结:什么时候用哪个?

  1. 使用 KVM (虚拟机) 的场景**:**

    • 需要运行不同的操作系统(如在 Linux 服务器上跑 Windows 应用)。

    • 需要极强的安全隔离(如公有云的多租户底层)。

    • 遗留系统迁移,应用强依赖特定的旧内核版本。

    • 作为基础设施层(IaaS),为上层提供计算资源。

  2. 使用 Docker (容器) 的场景**:**

    • 微服务架构,应用需要频繁迭代、快速部署。

    • 追求极致的资源利用率和启动速度。

    • DevOps 和 CI/CD 流程。

    • 云原生应用(Cloud Native)。

  3. 最佳实践 (混合使用)**:**

    • 底层**:物理服务器 ->** KVM 虚拟机 (提供安全隔离和资源切分)。

    • 上层**:虚拟机内部 ->** Docker 容器 (提供应用打包和敏捷交付)。

    • 编排**:Kubernetes (管理这些运行在 VM 里的容器)。**

面试回答金句**:**

"KVM 解决了硬件资源的虚拟化和强隔离问题,是云计算的基石;而 Docker 解决了应用交付的一致性和敏捷性问题,是云原生的核心。在现代架构中,我们通常是在 KVM 创建的虚拟机中运行 Docker 容器,结合两者的优势。"

二、Docker 默认使用以下 6 种 Namespace **来实现全方位的隔离

类比:像给进程戴上“VR 眼镜”,它只能看到自己虚拟出来的世界。

namespace 就像一个 隔板,把原本全局共享的大空间分隔成多个小房间,

每个进程只能在自己的房间里活动。进程看不到房间外的东西,所以它“以为”自己独占了系统。

1、namespace

Namespace 类型

隔离内容

作用详解

PID (Process ID)

进程隔离

容器内的进程拥有独立的 PID 空间。容器内的第一个进程 PID 永远是 1,它看不到宿主机上的其他进程。

Net (Network)

网络隔离

容器拥有独立的网络设备、IP 地址、端口、路由表和防火墙规则。容器内看到的eth0和宿主机完全不同。

Mnt (Mount)

文件系统隔离

容器拥有独立的目录挂载结构。容器看到的根目录/是基于镜像构建的,看不到宿主机的真实文件系统(除非显式挂载)。

UTS (Unix Time-sharing System)

主机名隔离

容器可以拥有独立的主机名(Hostname)和域名,与宿主机不同。

IPC (Inter-Process Communication)

进程间通信隔离

隔离信号量、消息队列等 IPC 资源。容器内的进程只能与同容器内的进程通信。

User (User ID)

用户隔离

(可选/高版本默认) 容器内的 root 用户在宿主机上映射为普通用户,防止容器逃逸提权,增强安全性。

1、容易混淆的概念:Cgroups 是做什么的?

很多人会误以为 Cgroups 也负责隔离,这是错误的。

  • Namespace = 隔离 (Isolation) -> "我看不到你" (视线阻断)。

  • Cgroups = 限制 (Limitation) -> "我不能抢你的资源" (资源配额)。

2、 第三个支柱:UnionFS (联合文件系统)

虽然 UnionFS (如 Overlay2) 不直接负责运行时的“隔离”,但它实现了**镜像的分层存储写时复制 (Copy-on-Write)。**

  • 它让多个容器可以共享同一个基础镜像层,节省磁盘空间。

  • 它保证了容器对文件系统的修改不会影响到镜像本身或其他容器(这也是一种数据层面的隔离)。

文章作者: 楚少爱看雪
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 楚少爱看雪
学习 Study
喜欢就支持一下吧