BLOG
Enjoy when you can, and endure when you must.
Docker 镜像与写时复制

在 Docker 中,镜像是容器的基础。因此对其有一个清晰的认识非常重要。

Docker 镜像是由文件系统叠加而成。

最底端是一个引导文件系统,即 bootfs。当一个容器启动后,引导文件系统会随即从内存被卸载。

第二层是 root 文件系统 rootfs。rootfs 可以是一种或多种操作系统, 如 Debian 或 Ubuntu;在 Docker 中,root 文件系统永远只能是只读状态,并且 Docker 利用联合加载(Union mount)技术又会在 root 文件系统层上加载更多的只读文件系统。

Docker 将此称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(Parent Image),而最底部的镜像称为基础镜像(Base Image)。最后,当从一个镜像启动容器时,Docker 会在该镜像之上加载一个读写文件系统。这才是我们在容器中执行程序所在的地方。

 

可写容器
镜像(加入 Apache)
镜像(加入 emacs)
基础镜像(Ubuntu)

引导文件系统

(容器组、命名空间、设备映射)

内核

 

当 Docker 第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层之上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。由此,该文件的只读版本依然存在于只读层,只是被读写层的该文件副本所隐藏。该机制则被称之为写时复制(Copy on write)

 

参考资料:

《第一本Docker书》詹姆斯·特恩布尔 (James Turnbull),第四章

COMMENTS
LEAVE COMMNT