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/ 中。
  • 此时,它还只是磁盘上的一堆文件,并不是容器。