本文主要介绍的是Docker新版本将带来的新的Docker引擎存储镜像及容器文件系统数据的方式。这些更新将在Docker v1.10版本起对用户开放。

核心要点:

  • 更安全的引用镜像及分层

  • 新的发行版清单及pull功能

  • 针对现有镜像的升级包含一个迁移步骤

  • 使用迁移工具来最大限度地减少迁移时间

从v1.10版本起Docker采取了一种全新的方式在磁盘上定位镜像数据。在此之前,每个镜像及分层采用的是一串随机生成的UUID。而在1.10里,我们通过一个根据镜像及镜像层数据的安全哈希所生成的ID实现了一套基于内容寻址的方案。

这一新的方案为用户提供了更好的安全性支持,它通过一个内置的方法来避免ID冲突以及确保在pullpushloadsave之后的数据完整性。同时,它也带来了更好的镜像层共享支持,支持多个镜像自由共享它们的分层,即使它们不是来自于同一个build。

基于内容来定位镜像的话也使得我们更易于发现像有些部分已经事先下载好的这样的情况。由于我们的镜像和分层均是各自独立的,因此,你不必再拉取属于最初构建链里的每个镜像的配置。我们也不需要再为那些根本不会对文件系统做出更改的构建指令创建对应的分层。

基于内容的寻址也是本次发行版的许多功能的实现基础。镜像的pull及push部分的代码也被重写成采用一个所谓的下载/上传管理器来完成,这使得push和pull操作变得更加稳定,并且能够一定程度地减少并发请求方面的问题。该下载管理器针对下载失败的情况引入了重试机制并且在多并发下载方面有更好的优先级支持。

我们还在内容寻址的基础上引入了一个新的清单格式。它直接引用了基于内容寻址的镜像的配置及分层的校验数据。新的清单格式也使得我们可以使用一个清单列表来定位不同的架构/平台(更多内容敬请期待...)。迁移到新的清单格式这一过程对用户来说也是完全透明的。

准备更新

为了让你现有的镜像可以通过新的模式访问,我们不得不首先将它们迁移到一个可基于内容寻址的存储上。这意味着需要为你现有的数据重新计算一次安全校验。

当你第一次启动升级后的Docker服务时,当前所有的镜像,标签以及容器都会被自动迁移到新的模式下。而在装载你的容器之前,Docker守护进程会先为你现有的数据计算一次所有需要的校验码,在它完成之后,你所有的镜像和标签便会拥有一个全新的安全ID。

虽然这只是一个简单的计算操作,但是如果你拥有很多镜像数据的话,为这些文件计算相应的SHA256校验还是需要花费一定的时间的。 平均而言,你可以假定该迁移操作能以100MB/s的速度来处理数据。而在此期间,你的Docker服务将不会响应任何操作。

最大限度地减少迁移时间

如果你能够接受这一次迁移的时间成本的话,那么接下来升级Docker引擎以及重启服务等操作将可以做到对镜像的无缝迁移。然而,如果你想最大限度的减少Docker服务的宕机时间的话,那么你可以考虑使用一个我们提供的迁移工具,它可以在运行的同时保证你现有的Docker服务仍然能正常工作。

该程序会找出你当前所有的镜像,然后为它们计算对应的校验数据。在你升级并重启Docker服务后,已迁移镜像的校验数据便已经生成,这便能将Docker服务从这一计算任务中解放出来。而如果在迁移和升级的过程中间有新的镜像出现的话,Docker服务会在升级到1.10的时候处理它们。

你可以从下面这个地址获取该迁移工具:https://github.com/docker/v1.10-migrator/releases.

当然,该迁移工具也能够以Docker镜像的方式运行。当运行迁移工具的镜像时,你需要将你Docker的数据目录开放给该容器。如果你采用的是默认路径的话那么它的执行命令可能看上去会是docker run --rm -v /var/lib/docker:/var/lib/docker docker/v1.10-migrator。如果你使用的是devicemapper存储引擎的话,你可能还需要加上--privileged参数授权该工具访问你的存储设备。

Docker引擎 1.10 RC版现已推出。不妨试试,记录下使用过程中遇到的任何问题然后反馈给我们吧!

About Author

colstuwjx

colstuwjx

互联网运维工程师,IT屌丝一枚,好技术。