Docker 在其核心存储机制中采用了联合文件系统(Union File System,简称 UnionFS),这是一种将多个文件系统叠加在一起的技术。在 Docker 中,每个容器都基于一个或多个镜像层构建,这些镜像层以分层结构组织,并通过联合文件系统形成最终的容器根文件系统。
联合文件系统的工作原理如下:
-
镜像层:
- Docker 镜像是由一系列只读层组成的,每一层代表对前一层的一次修改。每次执行
RUN
命令或COPY
文件到镜像时,都会创建一个新的层。
- Docker 镜像是由一系列只读层组成的,每一层代表对前一层的一次修改。每次执行
-
写入层(可写层/容器层):
- 当启动一个容器时,Docker 会在所有镜像层之上添加一个可读写层。任何对容器内文件系统的更改都将发生在这个可写层上。
-
联合挂载(Union Mount):
- 联合文件系统会将所有底层只读镜像层和最上层的可写层联合挂载在一起,使得容器内的进程看到的是一个统一且完整的文件系统视图。
-
空间效率与性能:
- 由于各层之间的文件共享机制,相同的数据只在磁盘上存储一次,这极大地提高了存储效率。
- 同时,联合文件系统仅在有变更的层进行读写操作,对性能影响较小。
-
快照和回滚:
- 由于文件系统是分层的,所以可以很容易地创建镜像的新版本(即新的层)。同时,如果需要回滚,只需切换到之前的镜像层即可。
-
迁移和复制:
- 因为每个镜像都是独立的、包含完整历史记录的文件系统层集合,因此它们可以轻松地在不同的宿主机间迁移和复用。
实战中的典型应用包括:
- 使用
docker build
命令逐步构建多层镜像。 - 运行容器时,通过
-v
参数挂载卷,将宿主机目录映射到容器内部,以便数据持久化。 - 利用
docker commit
命令保存运行时容器的状态为新镜像,实现快速备份或生成新版本的应用镜像。
综上所述,Docker 的联合文件系统是其实现轻量级、高效且易于管理的基础技术之一。它让 Docker 可以快速创建、启动和停止容器,同时保证了容器间的资源隔离和环境一致性。