Docker 到底是什么?
Docker 容器本质上是宿主机上的一个特殊进程。它并没有创造新的硬件虚拟化技术,而是利用 Linux 内核的特性,给进程戴上了“VR眼镜”(Namespaces)和“手铐”(Cgroups)。
容器 = Namespaces (隔离) + Cgroups (限制) + UnionFS (镜像)
1. Namespaces (隔离机制)
Namespaces 让进程产生“幻觉”,以为自己独占了操作系统。
| 类型 | 隔离内容 | Docker 效果 |
|---|---|---|
| PID | 进程编号 | 容器内进程 PID 为 1,看不到宿主机进程。 |
| NET | 网络设备/端口 | 每个容器有独立的 eth0 IP,端口不冲突。 |
| MNT | 文件挂载点 | 容器有独立的文件系统,看不见宿主机文件。 |
| UTS | 主机名 | 容器有自己的 Hostname。 |
2. Cgroups (资源控制)
如果没有 Cgroups,一个死循环的容器会吃光服务器 CPU。Cgroups (Control Groups) 负责限制、记录和隔离进程组所使用的物理资源。
🔒 资源限制
限制内存上限(如 512MB)。超过即被 OOM Kill。
⚖️ 优先级
分配 CPU 时间片权重,保证关键业务。
3. UnionFS (分层存储)
Docker 镜像由多层只读文件系统组成。运行时,Docker 只是在最顶层盖了一层“读写层”。
Copy-on-Write (写时复制): 只有当你修改文件时,Docker 才会把它从只读层复制上来。这使得容器启动只需毫秒级。
⬇️ Memory Limit: 512MB
PID 1
Bash
Host Kernel (Shared)
Layer 1: Base OS
Layer 2: App Libs
Layer 3: RW Layer
LINUX HOST KERNEL
🚀 Docker "徒手" 构建实验室
Welcome. 请点击下方按钮,手动模拟构建容器的过程。
----------------------------------------
----------------------------------------
点击下方命令块查看详细原理
STEP 1: 准备
tar -xvf alpine.tar -C rootfs/
STEP 2: 隔离
unshare --pid --net --mount-proc --fork /bin/bash
STEP 3: 禁锢
chroot ./rootfs /bin/sh
STEP 4: 限制
echo 100M > memory.limit_in_bytes
Step 1: 镜像只是个压缩包
Docker 镜像本质上就是文件系统的压缩归档。
- tar -xvf: 我们把下载的 Alpine Linux 文件系统解压到一个普通目录
rootfs/中。 - 此时,它还只是磁盘上的一堆文件,并不是容器。