问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁用占用了这么多磁盘空间

发布网友 发布时间:2022-04-29 12:50

我来回答

1个回答

热心网友 时间:2022-06-28 04:21

本文通过一个简单的示例,可以证明Docker能够很快地将磁盘占满。该示例通过play-with-docker.com运行。点击Add new instance即可创建新的实例,该实例安装了最新版的Docker 17.03。这篇博客主要讨论磁盘空间,那么不妨使用df命令查看磁盘的初始状态:
$ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/... 10.0G 443.3M 9.6G 4% / tmpfs 60.0G 0 60.0G 0% /dev tmpfs 60.0G 0 60.0G 0% /sys/fs/cgroup /dev/xvda1 49.1G 3.7G 43.3G 8% /etc/resolv.conf /dev/xvda1 49.1G 3.7G 43.3G 8% /etc/hostname /dev/xvda1 49.1G 3.7G 43.3G 8% /etc/hosts shm 64.0M 0 64.0M 0% /dev/shm /dev/mapper/... 10.0G 443.3M 9.6G 4% /graph/overlay2

可知,在新创建的play-with-docker.com实例,一共有10GB磁盘空间,其中接近500MB已被占用。
接下来编写Dockerfile来创建一个镜像。这个镜像基于Alpine镜像;镜像将写入3个随机的文件,每个文件1GB,文件由dd命令生成;因为这个镜像并没有实际作用,因此CMD设为/bin/true。
FROM alpine RUN dd if=/dev/zero of=1g1.img bs=1G count=1 RUN dd if=/dev/zero of=1g2.img bs=1G count=1 RUN dd if=/dev/zero of=1g3.img bs=1G count=1 CMD /bin/true

运行docker build -t test .即可创建镜像,执行完成后将生成一个3GB的镜像。
$ docker image ls REPOSITORY TAG CREATED SIZE test latest 38 seconds ago 3.23GB alpine latest 5 weeks ago 3.99MB

不难理解,该镜像占用了相应大小的磁盘空间。
$ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/... 10.0G 3.4G 6.5G 34% /

若只写入2个随机文件,则需要修改Dockerfile,删掉一行。为了避免构建镜像时使用缓存,我在dd命令之前添加了一行echo命令。
FROM alpine RUN echo foo RUN dd if=/dev/zero of=1g1.img bs=1G count=1 RUN dd if=/dev/zero of=1g2.img bs=1G count=1 # RUN dd if=/dev/zero of=1g3.img bs=1G count=1 CMD /bin/true

本来以为这样可以节省1GB磁盘空间,然而实际情况更加糟糕!
$ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/... 10.0G 5.4G 4.5G 54% /

旧的Docker镜像一直存在,最终磁盘空间会很快被用完。Docker 1.13引入了docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况。
$ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 0 5.373GB 5.373GB (100%) Containers 0 0 0B 0B Local Volumes 0 0 0B 0B

可知,实例上一共有3个Docker镜像: apline镜像,包含3个1GB随机文件的镜像以及包含2个1GB随机文件的镜像。这些镜像占用了超过5GB磁盘空间。由于我们并没有基于这些镜像运行容器,所以它们都可以被删除,所以可回收的(RECLAIMABLE)磁盘空间为100%。使用docker run test运行test镜像再查看:
$ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 1 5.373GB 3.225GB (60%) Containers 1 0 0B 0B Local Volumes 0 0 0B 0B

现在情况就不同了,我运行了一个容器,它执行/bin/true之后就很快退出了。
这个容器绑定了test镜像,test镜像被标记为活跃(active)因而不能被删除,这导致可回收的磁盘空间变少了。
现在来清理一下磁盘空间。
Docker提供了docker system prune,可以用于清理dangling镜像(参考What are Docker : images?)和容器,以及失效的数据卷和网络。
$ docker system prune WARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all networks not used by at least one container - all dangling images Are you sure you want to continue? [y/N] y Deleted Containers: 1cdf866157b4a97e151125af3c2a7f186a59b6f63807e2014ce1a00d68f44e1d Deleted Images: deleted: sha256:f59bb277... deleted: sha256:695b8e70... deleted: sha256:93b1cceb... deleted: sha256:c74d6bcd... deleted: sha256:df8b9bb1... deleted: sha256:dfe8340f... deleted: sha256:ce1ee654... Total reclaimed space: 3.221GB

根据警告信息可知,这个命令会删除所有关闭的容器以及dangling镜像。示例中,含有3个1GB随机文件的镜像的名称被占用了,名称为:,为dangling镜像,因此会被删除。同时,所有的中间镜像也会被删除。这样的话,一共3GB的磁盘空间被回收了!
更进一步,使用-a选项可以做深度清理。这时我们会看到更加严重的WARNING信息:
$ docker system prune -a WARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all networks not used by at least one container - all images without at least one container associated to them Are you sure you want to continue? [y/N] y Deleted Images: untagged: test:latest deleted: sha256:c515ebfa2... deleted: sha256:07302c011... deleted: sha256:37c0c6474... deleted: sha256:5cc2b6bc4... deleted: sha256:b283b9c35... deleted: sha256:8a8b9bd8b... untagged: alpine:latest untagged: alpine@sha256:58e1a1bb75db1... deleted: sha256:4a415e366... deleted: sha256:23b9c7b43... Total reclaimed space: 2.151GB

这个命令将清理整个系统,并且只会保留真正在使用的镜像,容器,数据卷以及网络,因此需要格外谨慎。比如,我们不能在生产环境中运行prune -a命令,因为一些备用镜像(用于备份,回滚等)有时候需要用到,如果这些镜像被删除了,则运行容器时需要重新下载。
此时,所有未绑定容器的镜像将会被删除。由于第一次prune命令删除了所有容器,因此所有镜像(它们没有绑定任何容器)都会被删除。
$ df -h Filesystem Size Used Available Use% Mounted on /dev/mapper/... 10.0G 442.5M 9.6G 4% /

现在,已使用的磁盘空间又变成了4%。本文的示例只是冰山一角,因为一旦我们运行了真正的容器,并且使用了Docker数据卷和Docker网络,则磁盘空间将会更快用完。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 腾讯游戏平台的头像和名字怎么改啊看这个头像和名字恶心 紧匝什么意思 绷的组词是什么 “他把两眼睁得滴溜圆,把头又狠狠的摇了几摇,越发指的越紧了。在里面'紧”的意思是? 绷的多音字是什么,要拼音和组词 紧组词和拼音 苹果的酷狗音乐为什么闹钟只通知但是音乐不响? 为什么苹果手机设置了酷狗铃声闹钟后,到点时去没有声音是怎么回事? 想做淘宝直播买衣服, 怎么操作,货源哪里找? 直播衣服哪里拿货- 问一问 word文档出现问题,打开后里面显示有多少多少个字符,但看不见文字 word文档显示不完整是怎么回事,有些字没有,还有图? 建行个贷用户,有一次逾期,有负债,近期查询较多,还可以申请分期通吗? 买的香椿几天没吃放冰箱变老了怎么办? 建设银行快贷是怎么分期的- 问一问 香椿叶捣辣椒放了几天变味了还能吃吗 烫好的香椿存放一宿还能吃吗 建行80000快贷到期无力偿还,想分多期偿还该如何申请,银行会通过吗? 高手帮忙下---为什么我的一个word文档打开后,里面的汉字都没了 隔夜香椿隔夜菜都不能吃么 秦钥飞的故事是怎的 秦玥飞的经历 华为手机通话背景变成黑色了怎么改- 问一问 centos docker 镜像可以移到其它服务器么 腾讯游戏论坛头像怎么改啊? 怎样改变华为荣耀v20手机通话时的背景颜色? 多租户环境下,Docker的安全隔离怎么破 银元怎么通过声音辨别真假,声音什么样的,有嗡嗡响的,还有声音一荡一荡的,有真银元声音吗,发过来听听 使命召唤手游这个头像怎么换? 怎么鉴定古银币 我想知道qq游戏里怎样把自己的头像换掉 华为手机怎么更改来接电话的默认背景。不是一个一个改,而是全部改。华为荣耀V20 怎样改变v20通话时的背景颜色? 银元掉在地上有声音 怎么去除那种液体胶(502) 银元用银元敲一下声音长是真的还是假的。我的重量27? 液体胶不小心倒在了桌子上怎么去除 羽绒服上站粘上普通液体胶水怎样去除 真银元能用磁铁吸到吗 如何去掉溅到衣服上的液体胶水呀?