简介
Docker的graph driver主要用于管理和维护镜像,包括把镜像从仓库下载下来,到运行时把镜像挂载起来可以被容器访问等,都是graph driver做的。涉及的docker命令有
- Docker pull
- Docker push
- Docker import
- Docker export
- Docker load
- Docker save
- Docker build
Docker的graph driver做的事情,基本上是对docker的image定义的实现,而OCI的image-spec是基于docker的image spec的,所以理论dockergraph driver做的事情,都应该被image-spec的实现所覆盖。
目前docker支持的graph driver有:
- Overlay
- Aufs
- Devicemapper
- Btrfs
- Zfs
- Vfs
这些driver各有优劣,以后会慢慢补充对比。
Overlay driver介绍
Graph driver中最复杂的部门就是梳理清楚在构建各种镜像层关系时涉及的各种id以及他们的组织关系。特别是docker镜像在支持content addressable之后,镜像的id组织关系变得异常复杂。Overlay driver中,对镜像的id会涉及到多种类型:
- 对一个镜像生成的唯一id值,下文称为image-id
- 运行容器时把镜像挂载起来后生成的一个唯一id值,下文称为mount-id
- 对每一个镜像层生成的一个唯一的随机id,下文中称为cache-id
- 根据每一个镜像层的内容单独生成的content addressable id,下文称为layer-id
- 根据每一层镜像,以及该镜像的所有底层镜像的内容生成的content addressable id,下文称为chain-id
对于一个镜像来说,其最底层的layer,其layer-id和chain-id是一样的。
Layer-id和chain-id的存在比较好理解,其中chain-id的概念也是image-spec中定义必须有的,cache-id的存在感觉必要性不大,目前不清楚为什么还要搞一个cache-id,猜测可能是为了向前兼容的原因。Image-id,mount-id和cache-id都是随机生成的,可以合起来跟content addressable id对比理解。
关键目录介绍
/var/lib/docker/overlay
这里存放的是镜像的每一层layer解压后的结果,以及基于每一个镜像生成容器后,对镜像合并挂载后的目录和对应的init目录。这里的i