Docker容器轻量级隔离本质是复用宿主机内核,靠Namespaces实现进程级资源“看不见”隔离(PID、Network、MNT、UTS、IPC、USER共6类),靠Cgroups实现资源“管得住”限制(内存、CPU等硬配额)。

Docker 容器的轻量级隔离,本质不是靠“模拟硬件”或“运行完整操作系统”,而是直接复用宿主机 Linux 内核,用内核原生机制做进程级隔离和资源管控。
核心靠两个内核特性:Namespaces 和 Cgroups
Namespaces 负责“看不见”——让每个容器拥有独立的视图:
- PID namespace:容器里看到的进程号从 1 开始,和宿主机及其他容器互不干扰;
- Network namespace:容器有自己独立的网卡、IP、端口、路由表,改 /etc/hosts 不影响宿主机;
- MNT namespace:挂载点隔离,容器内 mount 操作只在自己文件系统生效;
- 还有 UTS(主机名)、IPC(进程间通信)、USER(用户 ID 映射)等,共 6 类基础隔离。
Cgroups 负责“管得住”——限制容器能用多少资源:
- 比如
docker run --memory=512m --cpus=1.5,背后就是 cgroup 设置内存上限和 CPU 权重; - 防止某个容器吃光内存导致整台机器卡死,也避免 CPU 争抢影响其他服务;
- 资源配额是硬限制,不是建议值,超限时内核会直接 kill 进程(如 OOM killer 触发)。
镜像分层 + 联合文件系统 = 启动快、体积小
Docker 镜像不是完整系统盘,而是一组只读层叠加一个可写层:
- 基础层(如 ubuntu:22.04)只存一份,100 个容器共享;
- 应用层只存差异内容(比如你加的 Python 脚本、配置文件),通常几 MB;
- 启动时直接加载进程,不用 boot kernel、init 系统、启动 service,所以秒级就绪。
和虚拟机的根本区别不在“有没有隔离”,而在“怎么隔离”
虚拟机靠 Hypervisor 模拟硬件,每个 VM 跑独立内核,开销大、启动慢;Docker 容器是宿主机上的普通进程(只是被 namespaces 和 cgroups “罩住了”),共享内核,没中间层损耗:
- 同样跑 Nginx,VM 镜像可能 2–3 GB,Docker 镜像常不到 100 MB;
- 一台 16GB 内存服务器,能跑几十个容器,但通常只能稳跑 3–5 个全功能 VM;
- 容器故障一般不影响宿主机和其他容器,但内核级 bug 或逃逸漏洞可能突破隔离——所以生产环境仍需合理权限控制(如禁用 --privileged)。
它不是“更弱的虚拟机”,而是“更专注的运行时隔离”
Docker 不解决跨操作系统问题(不能在 Windows 上原生跑 Linux 容器,除非带 WSL2),也不替代 KVM/Xen 做强隔离场景(如多租户云平台)。它的优势场景很明确:
- 微服务拆分后,每个服务独立打包、部署、扩缩容;
- CI/CD 流水线中快速拉起测试环境,用完即删;
- 开发与生产环境一致——“在我机器上能跑”变成“在任何 Docker 环境里都能跑”。


















