docker registry 在docker 1.10.0 以后对于layer id不再随机生成,而是采用了对于layer data生成digest,这样可以方便了各image共享相同layer,迁移工具: https://hub.docker.com/r/docker/v1.10-migrator/, 镜像删除参考 here, 经过测试发现1.10版本image保存保存结构如下:
样例采用busybox 0.1和0.2 版本,内容无变化,仅仅修改了tag推到registry 2.0 repo中,busybox 0.3添加了脚本到/目录并build提交,为了方便查看,对于digest进行了缩减。
Docker Registry的老版本v1是用python写的,新版本v2是用go写的 。它们的模型略有变化。老版本v1是个链表,A层链接到B层,B层链接到C层,层层组织起来一个镜像,每一层的ID都是随机生成的。这样一来浪费空间,不能实现层存储的共享,二来有安全隐患,如果不停地提交,会造成ID冲突概率提升。但也正因如此,删除的时候完全没有顾忌,真是成也萧何败也萧何啊。新版本v2的ID是对内容进行sha256哈希之后的结果,所以相同内容的层ID一定是相同的,很好地解决了v1的问题,就是删除功能需要仔细地设计才能实现。
docker busybox 0.1 和 0.2
registry `-- v2 |-- blobs | `-- sha256 | |-- 13 | | `-- 13596 tag: 0.1 | | `-- data 包含 layer1 + layer2 的引用 | |-- 2b | | `-- 2b8fd layer2 | | `-- data | |-- 8d | | `-- 8ddc1 layer1 | | `-- data | `-- a5 | `-- a5990 tag: 0.2 | `-- data 包含 layer1 + layer2 的引用 `-- repositories `-- test `-- busybox |-- _layers | `-- sha256 | |-- 2b8fd | | `-- link layer2 | `-- 8ddc1 | `-- link layer1 |-- _manifests | |-- revisions | | `-- sha256 | | |-- 13596 | | | `-- link | | `-- a5990 | | `-- link | `-- tags | |-- 0.1 | | |-- current | | | `-- link -> sha256:13596 tag: 0.1 | | `-- index | | `-- sha256 | | `-- 13596 | | `-- link | `-- 0.2 | |-- current | | `-- link -> sha256:a5990 tag: 0.2 | `-- index | `-- sha256 | `-- a5990 | `-- link `-- _uploads |-- 437d5280-c534-47d5-99c8-6dd97965392b | `-- hashstates | `-- sha256 | `-- 667590 `-- a436cb74-6899-4d4a-8f73-56dedab88ec1 `-- hashstates `-- sha256 `-- 1459
busybox 0.1 0.2 0.3
`-- v2 |-- blobs | `-- sha256 | |-- 13 | | `-- 13596 image.v1+json diff.tar.gzip | | `-- data tag:0.1 metadata [layer3, layer2] | |-- 27 | | `-- 2722a | | `-- data layer1 data json file | |-- 2b | | `-- 2b8fd | | `-- data layer3 data json file | |-- 8d | | `-- 8ddc1 | | `-- data layer2 data binnary file | |-- a4 | | `-- a4126 image.v1+json diff.tar.gzip diff.tar.gzip | | `-- data tag 0.3 metadata [layer4, layer2, layer1] | |-- a5 | | `-- a5990 octet-stream diff.tar.gzip | | `-- data tag 0.2 metadata [layer3, layer2] [docker tag] | `-- fd | `-- fdf18 | `-- data layer4 data `-- repositories `-- test `-- busybox |-- _layers | `-- sha256 | |-- 2722a | | `-- link layer4 data json file | |-- 2b8fd | | `-- link layer3 data json file | |-- 8ddc1 | | `-- link layer2 data binnary file | `-- fdf18 | `-- link layer1 data binnary file |-- _manifests | |-- revisions | | `-- sha256 | | |-- 13596 | | | `-- link | | |-- a4126 | | | `-- link | | `-- a5990 | | `-- link | `-- tags | |-- 0.1 | | |-- current | | | `-- link tag 0.1 | | `-- index | | `-- sha256 | | `-- 13596 | | `-- link | |-- 0.2 | | |-- current | | | `-- link tag 0.2 | | `-- index | | `-- sha256 | | `-- a5990 | | `-- link | `-- 0.3 | |-- current | | `-- link tag 0.3 | `-- index | `-- sha256 | `-- a4126 | `-- link `-- _uploads |-- 437d5280-c534-47d5-99c8-6dd97965392b | `-- hashstates | `-- sha256 | `-- 667590 |-- 562bcacd-22cf-4035-a02d-1149dd3b9157 | `-- hashstates | `-- sha256 | `-- 2112 |-- a436cb74-6899-4d4a-8f73-56dedab88ec1 | `-- hashstates | `-- sha256 | `-- 1459 `-- db8bf681-de97-40b0-baf0-75fe4c407449 `-- hashstates `-- sha256 `-- 1752
参考: