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 SizeUnique 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相减所得,所以是个算数值

—更新完毕—

综上所述:

发表评论

邮箱地址不会被公开。 必填项已用*标注