摘要:用了一段时间后,会发现它占用了不少硬盘空间。为了避免构建镜像时使用缓存,我在命令之前添加了一行命令。引入了命令,类似于上的命令,用于查看的磁盘使用情况。这些镜像占用了超过磁盘空间。现在,已使用的磁盘空间又变成了。
译者按: Docker镜像,容器,数据卷以及网络都会占用主机的磁盘空间,这样的话,磁盘很容易就会被用完。这篇博客介绍了一个简单的解决方案 - Docker System命令。
原文: What’s eating my disk? Docker System Commands explained
译者: Fundebug
为了保证可读性,本文采用意译而非直译。
用了一段时间Docker后,会发现它占用了不少硬盘空间。还好Docker 1.13引入了解决方法,它提供了简单的命令来查看/清理Docker使用的磁盘空间。
本文通过一个简单的示例,可以证明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
$ 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随机文件的镜像的名称被占用了,名称为
更进一步,使用-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网络,则磁盘空间将会更快用完。感兴趣的话,可以查看博客最后的视频(不要忘了订阅!)。在视频中,我介绍一个简单的WordPress应用,它由数个容器,数据卷以及网络构成。这个应用可以很快地消耗掉磁盘空间,我将介绍如何处理这个问题。
视频: What"s eating my disk?!Clean up your Docker System
欢迎加入我们Fundebug的Docker技术交流群: 305097057。
版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26890.html
摘要:但是,它有一个不大不小的问题,会比较消耗磁盘空间。执行命令之后,占用的磁盘空间减少了很多手动清理镜像容器数据卷对于旧版的版本之前,是没有命令的,因此需要进行手动清理。进一步分析可知,真正占用磁盘空间的是的日志文件。 摘要:用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们必须及时清理。 showImg(https://segmentfau...
摘要:摘要操作步骤很多,但是可以有效减少磁盘使用量。关于操作,我列了几个简单的。操作效果怎么样减少了接近的磁盘空间,这个大小应该与被删除的文档数量有关。操作步骤由于操作会阻塞的读写操作,因此应该对每个节点依次进行操作。 摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。 showImg(https://segmentfault.com/img/bV5PFN?w=800&h=45...
摘要:参照官网安装的时候,需要安装等包,但官网给的源是,国内访问不了,此时我们可以使用阿里云的仓库镜像。阿里云上没有附说明连接,简单摸索了下,如下设置可用。 Docker install Docker 参照官网 install kubernetes 安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.googl...
摘要:通过查看我的磁盘使用情况,并没有发现有什么不妥,而且,,看起来也没有问题哦是不是有问题,于是,但是也不行最终解决的方法这个命令,生效了为什么呢你可以想一下,我今记录一下我的解决问题的过程。 问题描述 nagios配合nrpe用来监控机器中运行项目的具体情况,还包括磁盘、网络、负载均衡和数据库等具体的使用情况; 我遇到的问题: 使用docker-compose替换原来项目,将所有的进程...
阅读 1441·2021-09-22 16:04
阅读 2801·2019-08-30 15:44
阅读 891·2019-08-30 15:43
阅读 769·2019-08-29 15:24
阅读 1847·2019-08-29 14:07
阅读 1136·2019-08-29 12:30
阅读 1732·2019-08-29 11:15
阅读 2742·2019-08-28 18:08