Skip to content

Docker 镜像分层与联合文件系统

一句话机制

Docker 镜像由一层层只读文件系统叠加而成(UnionFS 联合文件系统),创建容器时在镜像顶部加一个可写容器层:所有运行时的改动都落在容器层,镜像层永远只读,因而能被多个容器共享复用。

分层结构

可写容器层(Container layer)  ← 唯一可写,容器运行时改动都在这
──────────────────────────
镜像层 N(只读)
  ...
镜像层 1(只读)
──────────────────────────
bootfs(bootloader + kernel,内核加载后即卸载)
  • UnionFS:支持把文件系统的修改「作为一次提交」层层叠加,也可把不同目录挂载到同一虚拟文件系统下——这是分层的基础。
  • bootfs:最底层,含 bootloader 与 kernel;Linux 启动时先加载 bootfs,内核就绪后卸载。
  • 镜像层:只读,构建时每条指令通常对应一层。
  • 容器层:创建容器时动态加载到顶部,可写。

不变量

  1. 镜像只读,容器层才可写。所有对容器的改动只发生在容器层,镜像层不受影响。
  2. 镜像层可被多个容器共享。正因为镜像只读,一个镜像可以同时支撑多个容器而不冲突,节省磁盘与传输。
  3. 分层 = 复用。基于已有镜像构建新镜像,只新增「变化层」,是 Docker 镜像轻量的核心原因。

常见误解

  • ❌ 「容器里改了文件,镜像就变了」——错。改动只进容器层,镜像层只读;容器删掉,改动随之消失(要持久化用数据卷)。
  • ❌ 「每个容器都要拷贝一份完整镜像」——错。镜像层共享,容器只多出一个可写层。
  • ❌ 「容器内部自带完整操作系统」——错。镜像底部虽含内核相关 bootfs,但容器没有独立内核,直接复用宿主机内核。

关联

最近更新