Docker壁球和图层:哪些图层被合并,哪些仍然共享

提示:我知道这个问题,但并不完全或完全回答我的问题,或多或less没有针对性的问题(但是可以从中得出一些结论 – 我想说应该有一个是/否的问题 – 在这里是)。

案件:

  • 假设我有3个图像,一个叫做BASE,一个是CHILDa和CHILDb,两个孩子都是FROM BASE
  • 假设BASE的大小为1GB,假设我们不知道或者特别感兴趣,如果它被压扁了,因为它应该没关系(恕我直言)
  • CHILDa和CHILDb都添加了10层,每个500MB的大小
  • 假设我们使用docker build --squash CHILDa在创buildCHILDa和CHILDb时使用CHILDa

题:

当从registry中提取CHILDa和CHILDb时,我知道BASE图层将首先被拉出。 现在,我的问题是,在驱动器上的图像的确切大小是什么:

a)1GB(基本)+ 500MB(CHILDa)+ 500MB(childB)= 2GB
b)(1GB + 500MB)+(1GB + 500MB)= 3GB

那么BASE的层次就像在--sqaush情况下共享(这将是a) ),或者不共享, b)然后

我知道,BASE的图层不应该在CHILDa被构build和压扁时被压扁,只有在CHILDa创build的图层被压扁到一层,所以历史应该看起来像这样

  • BASE LAYER1
  • BASE LAYER2
  • BASE LAYER3
  • CHILDa LAYER1(压扁)

这意味着,所有的BASE图层都应该在传输时与CHILDb共享,并且在CHILDa和CHILDb都被拉的情况下也可以共享磁盘空间。 这将意味着a)将是答案。

我问这个问题有一个明确的答案,不要根据文档寻找build议或暗示。 可能甚至备份了一个testing? 这不是第一次,文档和技术实现不匹配eachother(在docker)

答案是A.您可以通过检查生成的图像轻松地看到Docker在做什么:

首先build立两个图像:

 $ docker build -t jenkins-blueocean:full . $ docker build -t jenkins-blueocean:squash --squash . 

比较一个图像(在这种情况下jenkins / jenkins计算基本图像)上使用的总磁盘空间:

 $ docker image ls jenkins/jenkins:2.77 REPOSITORY TAG IMAGE ID CREATED SIZE jenkins/jenkins 2.77 1a057287c665 6 weeks ago 814MB $ docker image ls jenkins-blueocean:full REPOSITORY TAG IMAGE ID CREATED SIZE jenkins-blueocean full 773f9e1cbd94 3 minutes ago 1.29GB $ docker image ls jenkins-blueocean:squash REPOSITORY TAG IMAGE ID CREATED SIZE jenkins-blueocean squash 9a8816dcc900 2 minutes ago 1.28GB 

该磁盘空间是累积的,并且会对不同图像中使用的图层进行加倍计数。 所以我们需要看看实际的图层。 使用docker inspect比较三个图像(基础,完整和压扁)的图层:

 $ docker inspect -f '{{json .RootFS.Layers}}' jenkins/jenkins:2.77 | jq . [ "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1" ] 

这个基础图像上升到层18a8691 …与完整的比较:

 $ docker inspect -f '{{json .RootFS.Layers}}' jenkins-blueocean:full | jq . [ "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1", "sha256:679b85b8d42598a7ecb5988e408da49cbb3f86402fd2e5694104839ff17a7015", "sha256:5fa620489d92edd3e7922d9335d803ea83c148793044e0da99144152f7988437", "sha256:17d03c6eda4a4d989f6751bb53d7bf356309938a1076af75bdf440195471fa2b", "sha256:7a78b2c7c995ddab1ba675aba1c2bc54cc289ba148fd39b600f592060d98c459", "sha256:f56b6c3fd8713236d077a95568a58445e6d6423113c0b68c6f10bef39bd6b6ff" ] 

完整的图像添加了5层图像。 观看压扁的:

 $ docker inspect -f '{{json .RootFS.Layers}}' jenkins-blueocean:squash | jq . [ "sha256:45f0f161f0749d09482ed1507925151b22b1f8c0c85970fe0857d61e530264b4", "sha256:560ec518567f4117ed651db78b9c46eee39e00f38a87d6200ad7c87b79432064", "sha256:deccd4ec00609f5f711578af469ce4ff43a5c73efc52517fc8ca362ebd36860c", "sha256:23543e96fe44ca57a96d8552a6d9d218f7aa93b928a1ec8bafcaa9df3cc5723b", "sha256:3de9ccb39b3bcf90c9215a49a84b340fedad87840d0580ffe0f0e0e8a1cb1f53", "sha256:559298d0ee994bb9f12a77b1acc6fdfb6c7120cbcadfd640f7a9d171729b2cb1", "sha256:4dc9d0cb0b3ca0f565aa29c7762f7322ece1e1fb51711feac3a52f3c20a28d2f", "sha256:93d818bcd1d5eb6c689e6964e89feb8a8a3a394a998552c540b7db74986266c7", "sha256:ac3d4345fe0474e18265fbb999fe6ab1c077fbb59876317406c7974c75c7ab5d", "sha256:83a60a36cc44ca6fdab64823e805a853106be334239eb9d43cc1b220bb6ad238", "sha256:7c78d70f156aaaee25540c9100ca28b68b554a966d448079896c413ae71a0e5d", "sha256:cfd8defeb8a79686260691ce89a36772b21af0f736628492c835bb8a5740b817", "sha256:fc4dc905efd22f932b74f95b53904736bebf52c2033e9853c54efb0b3f01560f", "sha256:456fa2e1bb798ba4ccc5d433013973772b673dfff1f1386f18ceffe7d18132da", "sha256:2446924bd5315bf6c46e8a5db2b61247da4ded48f4de148c15f8f5a2f9b1e91a", "sha256:5a4416e8de72a14e97b53484e6016cc8a5b79398a25eb3b80fa099740b9f32e3", "sha256:20901b1036e739e01c99d83e461059b3974003835a31e473f348fd70ece6c4e3", "sha256:6d9d9244ead270d545d5de253a6ebb95398a7c63b10977c5cf7345b1cbf7d201", "sha256:056fab22f880b32a4bbe4725b5b227891290097fd3791af452e52eb98b02cfb4", "sha256:18a8691ee145f81f617bf788f39617f46d84b9924911317e6226139074b1f3e1", "sha256:e05668bb7cbab8f964ea3512a9ce41568330218e0e383693ad9edfd1befce9aa" ] 

它只添加了一个新的图层。 基本图像本身并没有被压扁。

在磁盘上,每一层只存储一次,所以你只计算一次磁盘使用的基本映像。

请注意,我不build议在大多数情况下压缩图像。 它打破了图像内部早期图层的图像层caching的价值。 相反,我build议组织Dockerfile以最大化层caching的价值,并且如果存在一些系统开销,则使用多阶段构build来将层降低到单个副本。