前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker 1.13中docker system df的浅析(更新)

docker 1.13中docker system df的浅析(更新)

作者头像
nevermosby
发布2020-05-11 16:49:39
2.9K0
发布2020-05-11 16:49:39
举报

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

—更新完毕—

综上所述:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年1月25日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • docker system是个全新的独立命令集合
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档