docker是如何做虚拟化的
Docker 的本质是利用 Linux 内核的特性来做虚拟化,当然因此win与mac上跑的docker本质是跑了一个轻量linux虚拟机
一是使用Namespaces实现环境隔离,内核为每个容器分配了一套独立的命名空间,让容器觉得自己在独立运行,其中包括:
pid: 让容器拥有独立的进程树。
net: 独立的网络设备、IP 地址、端口。
ipc: 进程间通信隔离。
mnt: 挂载点隔离,容器只能看到自己的文件系统。
uts: 独立的主机名和域名。
user: 用户和组 ID 隔离。
二是Control Groups (cgroups) 实现资源限制免得给跑炸了,靠这个统计和限制资源的使用,确保只能使用分配的资源,防止容器耗尽宿主机的cpu或内存。
Control Groups对于内存是硬上限,当该组进程申请新内存时,内核会检查计数器。如果达到上限且无法通过回收(Swap)获取空间,内核会直接触发 OOM Killer(Out of Memory),杀掉该进程以保护宿主机。
而对于cpu是两种限制方式
- CPU Shares (权重):例如进程 A 权重 1024,进程 B 权重 512。只有在 CPU 繁忙时,A 才会分到比 B 多一倍的时间。如果 CPU 空闲,B 也可以跑满 100%。
- CPU Quota (硬配额):设定周期和配额在一个 100ms 的周期内,如果这组进程运行时间总和达到了 50ms,内核就会**挂起(Throttle)**该组所有进程,直到下一个周期开始
同时,docker使用UnionFS(联合文件系统),docker镜像使用多层只读层叠加
分层存储:当你下载一个镜像时,它其实是由多个层构成的。如果你有多个镜像(如 Ubuntu 和 Debian)都基于同一个基础层,Docker 只需要在磁盘上存储一份该基础层。
写时复制:如果你想修改底层只读层里的一个文件(比如 /etc/nginx/nginx.conf),UnionFS 会先把这个文件从只读层复制一份到顶部的“可写层”,然后在可写层进行修改。。所有对文件的修改都发生在“可写层,而不影响底层的只读镜像。这使得容器启动极快,且占用空间极小。
Docker 的虚拟化是通过以下组件协同工作的:
- Docker Client:
docker命令行。一个CLI - Docker Daemon (dockerd): 后台守护进程,负责管理容器、镜像、网络和存储卷。
- containerd & runc: 真正负责调用内核 API 创建和运行容器的低层工具。
对比于vm,vm是直接运行在硬件之上进行隔离,每个vm都要跑完整的操作系统,需要引导os,资源消耗也巨大
各种os隔离机制
硬件级辅助隔离
操作系统利用 CPU 的硬件特性来实现最底层的强制隔离:
特权级隔离 (Ring Levels): x86 架构通过 Ring 0(内核态)和 Ring 3(用户态)限制用户程序直接访问硬件或修改内核内存。
内存地址空间隔离 (Virtual Memory): 通过 MMU(内存管理单元)和页表,每个进程都有独立的虚拟地址空间。进程 A 无法直接访问进程 B 的内存,这防止了内存污染。
进程级隔离
这是通用操作系统最基本的隔离形式:
进程空间隔离: 每个进程拥有独立的堆、栈、数据段。
文件描述符隔离: 默认情况下,一个进程无法直接使用另一个进程打开的文件或网络连接。
资源配额隔离 (即Control Groups / cgroups)
视图/命名空间隔离 (即Namespaces)
访问控制与安全策略隔离
Capabilities: 将传统的 root 权限细分为多个小权限(如修改系统时间、绑定低位端口)。即使进程被攻破,攻击者也只拥有受限的权限。
MAC (Mandatory Access Control):
- SELinux / AppArmor: 基于标签(Label)或路径的强制访问控制。即使是 root 用户,如果没有相应的安全策略,也无法访问受保护的文件。
seccomp (Secure Computing mode): 限制进程可以调用的系统调用 (System Calls)。例如,一个纯计算进程可以被禁止调用 network 或 mount 相关的系统调用,从而缩小攻击面。
文件系统隔离
chroot: 更改进程及其子进程的根目录。进程无法访问“监狱”外的文件。
pivot_root: 比 chroot 更安全,用于切换根文件系统,常见于容器启动时,使旧的根文件系统对新进程不可见。
虚拟化隔离
Hypervisor 隔离 (Type-1/Type-2): 像 KVM、Xen。每个虚拟机(VM)都有独立的内核。这种隔离性比容器(共享内核)更强,因为即使 Guest OS 内核崩溃,通常也不会影响 Host OS 或其他虚拟机。
微内核隔离 (Microkernel): 如 L4、QNX。将驱动、文件系统等放在用户态运行。如果驱动程序崩溃,只会影响该服务,而不会导致整个操作系统崩溃。

