首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >docker 1.13中docker system df的浅析(更新)

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

作者头像
nevermosby
修改2025-07-02 16:49:09
修改2025-07-02 16:49:09
3.6K00
代码可运行
举报
运行总次数:0
代码可运行

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官方是怎么实现的,找到了相关源文件:

  • https://github.com/docker/docker/blob/master/daemon/images.go#L207

以下为sharedSized相关代码片段:

代码语言:javascript
代码运行次数:0
运行
复制
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的含义,是一个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 

代码语言:javascript
代码运行次数:0
运行
复制
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
    • https://github.com/docker/docker/blob/master/docs/reference/commandline/system_df.md
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年1月25日2,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • docker system是个全新的独立命令集合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档