Docker核心实现,依赖于 :Namespace、Cgroups、UnionFS @mikechen
Namespace
首先,Namespace 负责“看见什么”。

它将进程的 PID、网络、挂载点、用户等资源进行隔离。
PID Namespace:隔离进程号,让容器内看不到宿主机其他进程。
Mount Namespace:隔离挂载点和文件系统视图,容器能看到的是自己的根文件系统。
Network Namespace:隔离网络设备、IP、路由表、端口等。
UTS Namespace:隔离主机名和域名。
IPC Namespace:隔离进程间通信资源。
User Namespace:隔离用户和权限映射,让容器内外的 UID/GID 可以不同
Cgroups
其次,Cgroups 负责“能用多少”。

它可以限制容器进程对 CPU、内存、磁盘 I/O 等资源的占用。
CPU 子系统:限制 CPU 使用率、核心数、权重(例如 –cpus=0.5)。
Memory 子系统:限制内存使用上限、交换空间等(例如 –memory=512m),超出可能触发 OOM Killer。
BlkIO / IO 子系统:限制磁盘读写速度和 IOPS。
Network(通过 net_cls 等):可结合其他工具限制网络带宽。
比如:
docker run -m 512m --cpus=1 nginx
表示:
最大内存 512MB;
最多使用 1 核 CPU。
UnionFS
第三,UnionFS 负责“文件系统如何共享与独立”。

Docker 的镜像之所以轻量且可以复用,全靠 UnionFS(如 Overlay2, AUFS)。
它的核心特性是 分层控制 (Layering) 、和 写时复制 (Copy-on-Write):
分层:镜像由多个只读层叠加而成。
底层可能是 Ubuntu 系统,上层是 Java 环境,再上层是应用代码。
写时复制:当容器运行时,Docker 会在镜像只读层之上加一个“可写层”。
如果进程要修改文件,它会把文件从只读层拷贝到可写层再修改,这保证了镜像本身不会被破坏,且启动速度极快。
Capability
最后,Capability 负责“能做什么”。

它将传统 root 用户拥有的全部权限拆分为更细粒度的能力集合。
Docker 通过限制这些能力,降低容器内进程对宿主机的潜在风险。