Docker 容器虚拟化原理如何学

作者:袖梨 2026-08-13

Docker容器虚拟化基于Linux三大底层机制协同实现:Namespaces提供进程、网络等资源隔离,使容器拥有独立视图;cgroups实施CPU、内存等资源限制,防止过度占用;UnionFS通过只读镜像层叠加可写层实现高效复用与分层存储。

Docker 容器虚拟化原理不是靠死记概念,而是理解三层关键机制如何协同工作:隔离、限制、复用。掌握它不需要从内核源码开始,但得抓住 Linux 底层支撑点和 Docker 的封装逻辑。

Linux 命名空间(Namespaces)负责“看不见”

它让每个容器拥有自己独立的视图:进程 ID、网络栈、挂载点、主机名、用户 ID 等都互不干扰。比如 pid namespace 让容器里看到的 PID 1 是自己的 init 进程,而不是宿主机的 systemd;net namespace 让容器有自己独立的 lo 和 eth0,哪怕 IP 地址相同也不会冲突。这不是模拟硬件,而是内核对系统调用返回值的“过滤”。

cgroups(Control Groups)负责“用不多”

它不提供隔离,只做资源管控:限制某个进程组最多用 2GB 内存、不超过 50% CPU 时间、IO 读写速率上限等。Docker 启动容器时,会自动在 /sys/fs/cgroup/ 下为该容器创建对应子组,并写入进程 ID。你可以用 docker run -m 512m --cpus 0.5 nginx 直观验证效果,再用 cat /sys/fs/cgroup/memory/docker/*/memory.usage_in_bytes 查看实际使用量。

镜像分层与联合文件系统(UnionFS)负责“装得巧”

Docker 镜像不是打包成一个大文件,而是由多个只读层叠加而成(如基础 OS 层、运行时层、应用层),最上面加一层可写层供容器运行时修改。docker build 每条指令生成一层,相同层可被不同镜像共享。这解释了为什么拉取第二个基于 ubuntu:22.04 的镜像几乎不耗流量——底层已存在。你执行 docker history nginx 就能看到各层大小和构建命令。

动手验证比看图更重要

  1. unshare --user --pid --net /bin/bash 手动创建带用户和网络命名空间的 shell,再 ip a 看是否只有 lo;
  2. stress-ng --cpu 2 --timeout 30s 在容器里压测,同时在宿主机跑 top -p $(pgrep stress) 观察 CPU 占用是否受 --cpus 限制;
  3. docker save nginx | tar -t | head -n 20 查看镜像解包后的目录结构,感受分层组织方式。

真正吃透原理,是能说清“为什么改了容器里 /etc/hosts 不影响其他容器”“为什么重启容器后新写的日志消失了”“为什么两个容器用同一个镜像启动却互不感知”。不复杂但容易忽略。

相关文章

精彩推荐