Docker容器核心原理是:通过Namespace实现进程、网络、文件系统等资源的逻辑隔离,利用Cgroups对CPU、内存等物理资源进行硬性限制,并借助UnionFS分层存储与Copy-on-Write机制实现镜像高效复用和容器读写分离。
Docker 容器核心原理架构不是靠死记命令学出来的,而是靠理解“它在操作系统里到底干了什么”来掌握的。关键不在于背组件名字,而在于看清三层逻辑:隔离怎么实现、资源怎么限制、文件怎么存。
容器不是虚拟机,它本质是宿主机上的一组进程,只是被 Linux 内核“藏起来了”。Namespace 就是这个“藏”的机制。
pid namespace 让容器里看到的 1 号进程就是自己,不是宿主机的 systemd 或 initnet namespace 给容器配独立的网卡、IP、端口空间,所以多个 nginx 容器能同时监听 80 端口而不冲突mnt namespace 控制挂载点,容器里 df -h 显示的磁盘和宿主机完全不同uts 和 ipc 分别隔离主机名、域名与进程通信通道,避免命名污染和意外干扰你不需要手动创建 namespace,但可以用 unshare --pid --net /bin/bash 命令临时启一个带隔离的 shell,进去看看 /proc/self/ns/ 下的符号链接,就明白 Docker 在背后做了什么。
隔离解决“看不见”,Cgroups 解决“用不了太多”。
docker run -m 512m --cpus=0.5 这类参数,最终都会转化成对 cgroup v2 目录(如 /sys/fs/cgroup/memory/docker/xxx/)的写入cpu.weight(cgroup v2)或 cpu.shares(v1),控制的是调度器分配时间片的权重,不是硬核数绑定可以进容器执行 cat /sys/fs/cgroup/cpu.max 或 cat /sys/fs/cgroup/memory.max,看到的数值就是 Docker 给你设的上限——这就是真实生效的地方。
镜像不是打包压缩包,而是一堆只读层叠在一起,启动容器时再加一层可写层。
RUN、COPY 指令生成一个新层,层与层之间通过 overlay2 的 lowerdir、upperdir、merged 三目录联动docker history nginx:alpine 能看到每一层的大小和构建指令,帮你判断哪步臃肿了删掉容器后,只要没被其他镜像引用,它的 upperdir 就自动清理;基础镜像层则被所有容器共享——这才是镜像体积小、启动快的底层原因。
不复杂但容易忽略