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

  • 启用Linux Namespace配置(隔离)
  • 设置Cgroups参数(限制)
  • 切换进程的根目录(change root)

由于rootfs的存在,容器才有了一个重要特性:一致性。

打包的不只是应用,而是整个操作系统的文件和目录,应用和它运行所需要的所有依赖都被封装到了一起。

rootfs构成

  • 可读写层(rw)
  • Init层(ro+wh)
  • 只读层(ro+wh) ro+wh即readonly+whiteout(白障),即如果要删除一个只读层的文件,可以在读写层创建一个删除状态的文件覆盖只读层的展示。 Init层是Docker项目单独生成的一个中间层,用来存放/etc/hosts、/etc/resolv.conf等用户需要在启动容器时写入的仅仅对当前容器有效但不希望提交的一些文件,用户执行docker commit只会提交可读写层。 最终这些层都会被挂载到/var/lib/docker/aufs/mnt目录下,表现为一个完整的操作系统供容器使用。