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 就能看到各层大小和构建命令。
动手验证比看图更重要
unshare --user --pid --net /bin/bash 手动创建带用户和网络命名空间的 shell,再 ip a 看是否只有 lo;stress-ng --cpu 2 --timeout 30s 在容器里压测,同时在宿主机跑 top -p $(pgrep stress) 观察 CPU 占用是否受 --cpus 限制;docker save nginx | tar -t | head -n 20 查看镜像解包后的目录结构,感受分层组织方式。真正吃透原理,是能说清“为什么改了容器里 /etc/hosts 不影响其他容器”“为什么重启容器后新写的日志消失了”“为什么两个容器用同一个镜像启动却互不感知”。不复杂但容易忽略。
openclaw源码解读——入门与破局:2 OpenClaw项目定位与设计哲学:为什么它值得读
为什么我台式电脑找不到华为随行wifi3(我台式电脑找不到华为随行wifi3怎么办)
《新斗罗大陆》SSS外骨篇攻略
五一假期放假通知:确保员工知晓假期安排与公司关怀
华为随行wifi3pro怎么查看套餐(华为随行wifi3pro查看套餐方法)
iwrite学生登录入口进入最新地址-iwrite不能复制粘贴的解决方法