theme: orange
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
🤞 个人主页:@青Cheng序员石头
前两篇文章有讲到Linux 容器最基础的两种技术:Namespace 和 Cgroups。我们已经理解到“容器的本质是一种特殊的进程”。我们了解到隔离和限制,那么这篇文章一起聊聊容器里的进程看到的文件系统-镜像。
根文件系统rootfs
一个Docker镜像是由文件系统分层组成的。底层是一个引导文件系统,bootfs,它类似于典型的Linux/Unix引导文件系统。Docker用户可能永远不会与启动文件系统互动。事实上,当容器启动后,它被移到内存中,启动文件系统被卸载,以释放initrd磁盘镜像使用的RAM。到目前为止,这看起来很像一个典型的Linux虚拟化栈。
事实上,Docker接下来会在启动文件系统的基础上设置一个根文件系统,即rootfs。这个rootfs可以是一个或多个操作系统(例如,Debian或Ubuntu文件系统)。

镜像分层
在更传统的Linux启动中,根文件系统被挂载为只读,然后在启动后被切换为读写,并进行完整性检查。然而,在Docker的世界里,根文件系统保持在只读模式,Docker利用联合挂载的优势,在根文件系统上添加更多的只读文件系统。
联合挂载是一种挂载方式,允许同时挂载几个文件系统,但看起来是一个文件系统。联合挂载将文件系统叠加在一起,这样产生的文件系统可以包含任何或所有底层文件系统的文件和子目录。Docker称这些文件系统为图像。
镜像可以分层在彼此的上面。下面的图像被称为父图像,你可以遍历每一层,直到你到达图像堆栈的底部,那里的最终图像被称为基础图像。
最后,当一个容器从一个镜像启动时,Docker会在下面的任何层上挂载一个可读写的文件系统。这是我们希望我们的Docker容器运行的任何进程将执行的地方。这听起来很混乱,所以也许最好用一张图来表示。
写时复制
当Docker第一次启动一个容器时,最初的读写层是空的。随着变化的发生,它们会被应用到这一层;例如,如果你想改变一个文件,那么该文件将从下面的只读层复制到读写层。该文件的只读版本将仍然存在,但现在被隐藏在复制的下面。
这种模式在传统上被称为 "写时复制",是使Docker如此强大的特征之一。每个只读镜像层都是只读的,这个镜像永远不会改变。当一个容器被创建时,Docker从图像的堆栈中构建,然后在上面添加读写层。
该层与它下面的镜像层的知识和一些配置数据相结合,形成了容器。容器可以被改变,它们有状态,并且可以被启动和停止。这一点,以及图像层框架,使我们能够快速建立图像,并通过我们的应用程序和服务运行容器
少年,没看够?点击石头的详情介绍,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!
Docker镜像是由文件系统分层组成的,包括引导文件系统和rootfs。rootfs保持在只读模式,通过联合挂载增加只读层,形成镜像分层。容器启动时在读写层进行改动,实现写时复制。这种设计使得镜像可复用,容器轻量且高效。
1300

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



