今年四月份,随着 Docker registry 2.0 版本的发布,之前 Python 版本实现的 registry 正式被标记为 ‘deprecated’。V2 版本用 go 实现,在安全性和性能上做了诸多优化,并重新设计了镜像的存储的格式,带来了翻天覆地的变化。
本文将详细解读 V2 和 V1 的区别,并介绍灵雀云在生产环境同时支持 V1 和 V2 的镜像同步迁移实践,以及利用该同步系统对 docker hub 镜像实现实时同步的方法。
背景 Registry 作为 Docker 的核心组件之一负责镜像内容的存储与分发,客户端的 docker pull 以及 push 命令都将直接与 registry 进行交互。
最初版本的 registry 由 Python实现。由于设计初期在安全性,性能以及 API 的设计上有着诸多的缺陷,该版本在 0.9 之后停止了开发,新的项目 distribution 来重新设计并开发下一代 registry。
新的项目由 go 语言开发,所有的 API,底层存储方式,系统架构都进行了全面的重新设计已解决上一代 registry 中存在的问题。四月份 rgistry 2.0 正式发布,docker 1.6 版本开始支持 registry 2.0, 八月份随着 docker 1.8 发布,docker hub 正式启用 2.1 版本 registry 全面替代之前版本 registry。
新版 registry 对镜像存储格式进行了重新设计,并和旧版不兼容,docker 1.5 和之前的版本无法读取 2.0 的镜像。同时旧版本的 registry 中已有大量的镜像需要迁移到新版本 registry 中。
在灵雀云平台的客户可能会使用各个版本的 docker,也可能升级或者降级使用的版本。为了让 registry 的版本对用户透明,灵雀云在同一域名提供两套服务的基础上,在后台对镜像实现了新版和旧版的双向实时同步,以保证用户在切换客户端版本时不会出现 pull 镜像失败的情况。在此基础上,灵雀云实现了对 docker hub 中官方 library 镜像到灵雀云平台的实时同步,通过灵雀云的国内镜像社区来为国内用户提供快速的镜像下载服务。