容器的存储

挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”,它有一个更专业的名字:rootfs(根文件系统),是一个操作系统的所有文件和目录,并不包含内核。

由于 rootfs 里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它 运行所需要的所有依赖,都被封装在了一起。这就赋予了容器所谓的一致性:无论在本地、云端,还是在一台任何地方的机器上,用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就被重现出来了。

Docker 在镜像的设计中,引入了层(layer)的概念。也就是说,用户制作镜像的 每一步操作,都会生成一个层,也就是一个增量 rootfs。实现使用了作联合文件系统(Union File System)。Union File System 也叫 UnionFS,最主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下。

容器的存储

  • 可读写层:所有用户的操作增添存储在这个层中;

  • init层:存放 /etc/hosts、/etc/resolv.conf 等属于操作系统,但是需要用户修改的配置信息的文件;

  • 只读层:以增量的方式分别包含操作系统的基础内容;

Volume(数据卷)

作用:允许将宿主机上指定的目录或者文 件,挂载到容器里面进行读取和修改操作。

实现过程:

创建容器初始化进程 (dockerinit) -》开启 Mount Namespace -》挂在指定目录 -》执行 chroot(或者 pivot_root)

使用的挂载技术是 Linux 的**绑定挂载(Bind Mount)**机制:允许将一个目录或者文件,而不是整个设备,挂载到一个指定的目录上。

总结

对应最开始的图片,一个 Linux 容器,可以被“一分为二”地看待:

  1. 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;
  2. 一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。