Namespace 隔离 / Cgroup 限额 / UnionFS 分层 / 完整运行流程
虚拟机虚拟硬件,容器共享内核——这是本质差异。
| 对比项 | 虚拟机 (VM) | 容器 (Container) |
|---|---|---|
| 虚拟化层级 | 硬件级 (Hypervisor) | 操作系统级 (Namespace + Cgroup) |
| Guest OS | 每个 VM 自带完整 OS | 共享宿主机内核,无 Guest OS |
| 磁盘占用 | GB 级别 (数 GB ~ 数十 GB) | MB 级别 (数 MB ~ 数百 MB) |
| 内存占用 | 需预分配 GB 级内存 | 按需分配,MB 级起步 |
| 启动时间 | 分钟级 (1~5 min) | 秒级 (0.5~2 sec) |
| 性能 | 有 Hypervisor 损耗 (5%~20%) | 接近原生 (损耗 <2%) |
| 隔离性 | 强隔离 (硬件级) | 进程级隔离 (共享内核) |
| 密度 | 单机几个 ~ 十几个 | 单机数十 ~ 数百个 |
虚拟机 = 独栋别墅:自带地基、水电管道、花园,完全隔离但造价高、占地大
容器 = 合租公寓:共享地基和水电管道,用隔断墙分出独立空间,便宜高效
Docker Engine = 物业管理:统一管理各户的入住、退房、资源分配
Namespace 是 Linux 内核提供的进程隔离机制,让容器以为自己独占整台机器。
Namespace = 合租公寓的隔断墙:每户被墙隔开,互不干扰
PID = 每个人自己编号:我说"1号"是我家老大,你说"1号"是你家老大,互不冲突
NET = 每户有自己的门牌号和信箱,邮件不会串门
MNT = 每户看不到别人的房间,只能看到自己的
USER = 管理员在楼里是大爷,在楼外是普通人
Namespace 隔离了"看",Cgroup 限制了"用"——防止一个容器吃光所有资源。
Cgroup = 房东限电限水:每个租户有配额,不能无限制使用
CPU 限制 = 限电功率:你家最多用 50% 的电,超了就跳闸
Memory 限制 = 限水容量:水桶就 512 升,装不下就溢出
OOM Kill = 水桶溢出自动关水:超了直接停,不商量
不加限制 = 一个租客用光整栋楼的水电,其他人都没得用
镜像不是单个文件,而是一层层只读文件堆叠——这就是 Docker 轻量的核心。
镜像 = 千层饼:每层是只读的,叠在一起才是一个完整的饼
Container Layer = 顶上盖了张保鲜膜:只有这层可写,底下都是只读
COW = 在透明纸上写字:想修改就盖一层新透明纸写,不破坏底下那层
共享基础层 = 多人看同一本书:书是共享的(只读),各加自己的笔记(可写层)
从 Dockerfile 到容器运行,一条命令背后的完整链路。
docker build = 照着食谱做千层饼:每一步加一层,烤好了就不能改
docker run = 把千层饼端上桌盖保鲜膜:饼是只读的,保鲜膜上可以随便写
Network Bridge = 合租公寓的公共走廊:各户有自己的门牌号,通过走廊对外沟通
veth pair = 每户门内外的对讲机:一头在屋里,一头在走廊
Docker 内核原理高频面试题,30秒内给到面试官满意的回答。
虚拟机虚拟硬件自带 OS,容器共享内核只隔离进程——重量差 100 倍。
6 种:PID/NET/MNT/IPC/UTS/USER——分别隔离进程号、网络、文件系统、通信、主机名、用户。
Cgroup 通过 CFS 配额限 CPU、limit 文件限内存;超限则 OOM Killer 直接杀进程。
镜像是只读层叠叠乐,写时复制到顶层不改底层——共享层省空间、缓存层省时间。
CLI→dockerd→containerd→runc:挂载镜像→建 Namespace→设 Cgroup→跑入口进程。
veth pair 连容器和 docker0 网桥,网桥做路由,iptables 做 NAT 端口映射。
Docker Container = Namespace(隔离) + Cgroup(限额) + UnionFS(分层)
Namespace 让容器以为自己独占机器 → Cgroup 让容器不能吃光资源 → UnionFS 让镜像轻量可复用
Docker三原则:① 多阶段构建减小镜像体积 → ② .dockerignore排除不需要的文件 → ③ 数据持久化用Volume不要存容器内