chroot

在linux系统中,使用chroot可以改变进程的根目录到你指定的位置。“change root file system”。

容器镜像

口语中所描述的Docker容器镜像其实就是挂载在容器根目录,用来为容器进程提供隔离后执行环境的文件系统,即为容器的“根文件系统(rootfs)”。也可以简单的理解成包含了容器中运行的整个文件包。

对 Docker 项目来说,它最核心的原理实际上就是为待创建的用户进程:

  • 启用 Linux Namespace 配置。
  • 设置指定的 Cgroups 参数。
  • 切换进程的根目录(Change Root)。

这样容器看起来就像是在操作一个独立的根文件目录。而对于整个容器进程来说,rootfs打包了包含应用在内的整个操作系统环境(操作系统的文件、目录、应用执行需要的依赖),也就是我们常说的镜像

镜像的分层

Docker在设计镜像时,采用分层增量思想。
也就是说一个容器的rootfs可能是由多个层级组成。而合并这些层级则是用到了联合文件系统(Union File System)的能力。

一个镜像的多层级设计,一般包含好几个部分。

  • 只读层:

一般从基础镜像拉取的层级都是只读层。这些层级以增量的方式组成操作系统的一部分。

  • init层:

Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts/etc/resolv.conf等信 息。而这些信息一般只在当前容器中生效,并不希望随着docker commit提交。

  • 可读写层:

处于镜像的最上层,可以进行增删改操作。改动点可以随docker commit 和 push 提交,供他人使 用。对于“删除”了只读层的文件,其实是Docker项目是做了“白障”(whiteout)效果,当两个层级联合挂载的时候,被“删除的”文件会被遮挡。