为什么一个镜像会那么大?

Union 文件系统:是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

Docker 镜像依赖于 Union 文件系统,该文件系统特性就是一次性加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像原理

参考链接:https://blog.51cto.com/liuleis/2070461
Docker 的镜像实际上是由一层一层的文件系统组成。
image.png
对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。

  • 内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
  • 用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。

为什么docker镜像要采用这种分层结构呢?

最大的一个好处就是资源共享。

比如:有多个镜像都是从相同的 base 镜像构建而来的,那么宿主机只需在磁盘中保存一份 base 镜像。同时内存中也只需要加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker 镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。