《论文笔记》:Wharf: Sharing Docker Images in a Distributed File System
会议:SoCC’ 18
梗概
Wharf:通过分布式文件系统进行 Docker 镜像文件的共享,而不是一个物理机一个镜像文件。 Wharf将Docker的运行时状态划分为本地和全局部分,并有效地同步对全局状态的访问。
思维导图
1. 介绍
四个问题
现状:在Docker中,每个守护进程都是不共享的,也就是说,它在本地存储中提取和存储图像,然后从本地副本启动容器。
主要针对目前的 Docker 守护进程的管理方式的现状提出4个主要问题:
- 如果容器从不同节点上的相同镜像启动,则相同的镜像会存在于所有节点上。这就浪费了储存空间;
- 大规模节点同时拉取同一镜像,浪费网络带宽并且拖延容器启动时间
- 研究表明容器启动只需要6.4%的镜像数据,但每个节点均拉取完整镜像,这进一步浪费了存储空间和网络带宽
- 有一些集群仅提供共享存储,而计算节点无磁盘,这限制了容器的使用
三个贡献
- 分析了将Docker存储模型移植到分布式存储中的意义
- 为Docker设计了一个共享的镜像存储库,可以在分布式文件系统中存储镜像
- 文章实现了 Wharf,并应用了细粒度的层锁,这是一种利用Docker图像分层结构的同步机制,以减少同步开销
wharf 的特点与优势
分布式存储
Wharf使分布式Docker守护进程能够协同检索和存储共享存储中的容器映像,并从共享映像创建容器。通过在中央存储中为所有守护进程只保留一个映像的副本,Wharf可以显著降低网络和存储开销。
分层拉取,层锁
Wharf利用Docker图像的结构来降低同步开销。图像由几个层组成,可以并行下载。Wharf实现了一个细粒度的层锁来协调对共享映像存储的访问。这允许守护进程并行地拉取同一映像的不同层和不同的映像,从而提高网络利用率并避免过度阻塞。Wharf将每个守护进程的数据和元数据分割为全局和本地状态,以最小化必要的同步。另外,使用层锁,Wharf确保每个守护进程只能看到一致的层状态,并防止在单个守护进程失败时整个集群失败。
用户透明和兼容性
Wharf被设计为对用户透明,并允许重用现有的Docker图像而不做任何更改。Wharf独立于分布式存储层,可以部署在任何存储系统上,提供简易的语义。Wharf目前支持两种常见的Docker即写即拷存储驱动程序AUFS和overlay2。此外,虽然我们为Docker实现了Wharf,但所提出的设计也适用于其他容器管理框架。
2. Docker 背景知识
这里仅提取一些关键点
层是一组文件,表示容器文件系统树的一部分。
Docker 容器通过hash 在本地实现了共享层缓存,这节省了存储空间并提高了容器的启动时间。
Docker push 时将镜像分层并压缩归档为 tar,然后附带一份 manifest 文件用于 pull 的时候的镜像检索
2.3 容器创建和图驱动
当创建一个新容器时,Docker 守护进程的创建步骤:
- 首先检查所需的镜像是否已经在本地可用
- 如果没有,则从注册表中检索清单,通过首先读取清单,然后下载并提取对应的层到本地存储,
- 如果守护进程检测到其中一个层已经在本地存在,它将不会下载该特定层
- 默认情况下,守护进程并行下载三层。
COW(写时复制):
检索映像之后,守护进程将创建容器。因此,它首先在一个挂载点上联合只读层,然后在其上创建一个可写层。对容器根文件系统所做的任何更改都通过写时复制(COW)机制存储在可写层中。这意味着,在从只读层修改文件之前,将其复制到可写层,并对该副本进行所有更改。一旦容器退出,可写层通常被丢弃。
Docker 的图形驱动
具体的创建联合挂载点与COW能力取决于 Docker 的图形驱动程序;目前应用最广泛的为层叠驱动和专用驱动
层叠驱动