第一章:从一个“硬盘刺客”的抱怨开始
“我的天!我才玩了几天Docker,/var/lib/docker这个目录怎么就几十个G了?!它是不是背着我偷偷下载小电影了?”
如果你也曾发出过类似的灵魂拷问,那么恭喜你,你遇到了每一位Docker玩家的必经之路。Docker镜像,这个看似简单的打包工具,其实内部藏着一套极其精巧和高效的存储机制。它不是一个死板的、完整的、一成不变的** monolithic 大文件,而更像是一个千层蛋糕,一套乐高积木,或者一本洋葱日记**。
今天,我们就化身Docker镜像的“解剖师”,一层一层地剥开它的心,看看它到底是怎么存储的,为什么它既能保证“一份基础,多处运行”的一致性,又会一不小心就成了吞噬硬盘空间的“饕餮巨兽”。准备好了吗?我们的“减肥”之旅,现在开始!
第二章:灵魂画手:图解“千层蛋糕”的终极奥义
想象一下,你要做一个水果千层蛋糕。你不会每次都从种小麦、养奶牛开始,对吧?你会:
- 最底层:先买一个现成的蛋糕胚(基础层,比如
ubuntu:22.04)。 - 第二层:涂上一层奶油(执行命令
apt update,产生新的一层)。 - 第三层:铺上一层草莓(添加你的应用文件
app.jar,又产生新的一层)。 - 最顶层:再点缀一些蓝莓和糖粉(设置启动命令
CMD ["java", "-jar", "app.jar"],最后一层)。
最终你看到的,是一个完整的、美味的蛋糕(可运行的容器)。但本质上,它是由多个独立的、可复用的层堆叠起来的。
Docker镜像正是如此。每一个镜像都由一系列只读的(read-only)层(layer)组成,而容器则在最顶层添加一个可写的薄层(容器层),用于运行时的所有修改。
这种结构的精妙之处在于:
- 共享与复用:如果两个镜像都基于同一个
ubuntu:22.04,那么你的硬盘上只存有一份ubuntu:22.04的数据。它们共享这个基础层,极大地节省了空间。 - 高效分发:当你
docker pull时,如果本地已有某些层,就无需再次下载。拉取速度飞快,就像只下载蛋糕顶上那几颗不一样的草莓一样。 - 快速构建:构建镜像时,Docker会利用缓存。如果
Dockerfile中的某一步及之前的步骤没有变化,它就会直接使用已有的层,跳过重建,加速构建过程。
而将这些层魔法

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



