docker 1.13中docker system df的浅析(更新)
docker system是个全新的独立命令集合
docker system
看起来是个很大的局,目前有以下子命令:
- docker system df
- docker system events
- docker system info
- docker system prune
其中我特别感兴趣的是docker system df
和docker system prune
这两个命令。今天先讲讲docker system df
。以下为运行该命令后的结果截图:
其中每个docker image都有一个Shared Size
和Unique Szie
,两者加起来就是一个docker image的大小,这个看上去很有趣。首先讲一下自己设想中的sharedSize
是什么概念。一个docker image的sharedSize
,即所谓“共享大小”,应该是这个image包含的每一层layer是否被至少一个其他docker image所公用,如果是,这个layer被称之为共享layer,它的大小就被加入它所在docker image的sharedSize。
想看下docker官方是怎么实现的,找到了相关源文件:
以下为sharedSized相关代码片段:
if withExtraAttrs {
// Get Shared and Unique sizes
for img, newImage := range imagesMap {
rootFS := *img.RootFS
rootFS.DiffIDs = nil
newImage.SharedSize = 0
// 通过diffID,计算出每个layer的chainID
for _, id := range img.RootFS.DiffIDs {
// 每次append一个diffID
rootFS.Append(id)
// ChainID这个方法会用最新append的diffID,计算出对应的chainID
chid := rootFS.ChainID()
// 通过chainID计算出对应layer的大小
diffSize, err := allLayers[chid].DiffSize()
if err != nil {
return nil, err
}
// 如果这个由chainID对应的layer的引用大于1,说明该layer是共享的,计入当前image的SharedSize中,以此类推。
if layerRefs[chid] > 1 {
newImage.SharedSize += diffSize
}
}
}
}
分析上面代码:
diffSize
是layer的大小layerRefs
应该是个关于layer引用计数的数组,通过chid
能够唯一确定一个layer,说明chid
是layerID,也就是docker 1.10后,引入的content-addressable ID。allLayers
这个数组应该是维护所有本地layer,通过chid
找到目标layer,并使用DiffSize
方法,获取这个layer的大小- 使用
diffID
,通过方法rootFS.ChainID()
这个方法,可以计算得出chid
,查询了diffID
的含义(见https://github.com/docker/docker/blob/master/layer/layer.go#L68),是一个hash值,用来标记layer被tar压缩过的产物。所以概念上,就是可以通过压缩过的layer hash值,获取原始layer content-addressable hash值。
—2017-1-26 更新 —
Unique Size概念比较简单,找到了相关源代码:
https://github.com/docker/docker/blob/master/cli/command/formatter/image.go#L259
func (c *imageContext) UniqueSize() string {
c.AddHeader(uniqueSizeHeader)
if c.i.VirtualSize == -1 || c.i.SharedSize == -1 {
return "N/A"
}
return units.HumanSize(float64(c.i.VirtualSize - c.i.SharedSize))
}
分析上面代码:
- VirtualSize就是docker image的大小
- UniqueSize是通过VirtualSize与SharedSize相减所得,所以是个算数值
—更新完毕—
综上所述:
- 所谓的docker image的
share size
概念跟我预期的差不多。 - 后来找到了官方解释,口径为
SHARED SIZE is the amount of space that an image shares with another one