Docker – 如何分析一个容器的磁盘使用情况?

我一直在寻找一段时间,但找不到分析Docker容器/卷的磁盘使用情况的方法。

我可以看到Docker需要12GB的文件系统:

2.7G /var/lib/docker/vfs/dir 2.7G /var/lib/docker/vfs 2.8G /var/lib/docker/devicemapper/mnt 6.3G /var/lib/docker/devicemapper/devicemapper 9.1G /var/lib/docker/devicemapper 12G /var/lib/docker 

但是,我怎么知道这是如何分布在容器?

我尝试通过运行附加到容器(新的v1.3命令)

 docker exec -it <container_name> bash 

然后运行“df -h”来分析磁盘使用情况。 它似乎在工作,但没有使用“来自卷”的容器。

例如,我为MongoDB使用了一个只有数据的容器,名为“mongo-data”。

当我运行“docker run -it -volumes-from mongo-data busybox”,然后在容器内运行“df -h”时,它表示挂载在'/ data / db'上的文件系统(我的'mongo-data'数据容器)使用11.3G,但是当我做“du -h / data / db”时,它说它只用了2.1G。

那么,如何分析容器/卷磁盘的使用情况? 或者,就我而言,我怎样才能find“mongo-data”容器大小?

非常感谢,

要查看容器的文件大小,可以使用docker ps-s参数:

 docker ps -s 

1.13.0之后,Docker包括一个新的命令docker docker system df来显示docker的磁盘使用情况。

 $ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 1 2.777 GB 2.647 GB (95%) Containers 1 1 0 B 0B Local Volumes 4 1 3.207 GB 2.261 (70%) 

显示有关空间使用情况的更多详细信息

 $ docker system df -v 

发布这个答案,因为我的意见隐藏:

列出一个容器的大小:

 du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>` 

列出容器卷的大小:

 docker inspect -f "{{.Volumes}}" <container_name> | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h 

编辑:列出所有正在运行的容器的大小和容量:

 for d in `docker ps -q`; do d_name=`docker inspect -f {{.Name}} $d` echo "=========================================================" echo "$d_name ($d) container size:" sudo du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" $d` echo "$d_name ($d) volumes:" docker inspect -f "{{.Volumes}}" $d | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h done 

注意:根据您的Docker文件系统更改“devicemapper”(例如'aufs')

卷的部分不工作了,所以如果有人感到有兴趣,我只是改变一下上面的脚本:

 for d in `docker ps | awk '{print $1}' | tail -n +2`; do d_name=`docker inspect -f {{.Name}} $d` echo "=========================================================" echo "$d_name ($d) container size:" sudo du -d 2 -h /var/lib/docker/aufs | grep `docker inspect -f "{{.Id}}" $d` echo "$d_name ($d) volumes:" for mount in `docker inspect -f "{{range .Mounts}} {{.Source}}:{{.Destination}} {{end}}" $d`; do size=`echo $mount | cut -d':' -f1 | sudo xargs du -d 0 -h` mnt=`echo $mount | cut -d':' -f2` echo "$size mounted on $mnt" done done 

(这个答案没有用,但是因为有些评论可能会把它留在这里)

docker images将显示“虚拟大小”,即包括所有较低层在内总共有多less。 所以如果你有容器共享相同的基本图像,一些重复计数。

文件

如果你想减less多层图像的大小,我可以推荐Jason Wilder的docker-squash工具。 从GitHub在这里获取: https : //github.com/jwilder/docker-squash

请记住, ps --size可能是一个昂贵的命令,需要花费几分钟时间才能完成。 这同样适用于size=1容器列表API请求。 最好不要经常运行它。

看看我们编译的替代scheme ,包括du -hs持久卷目录的du -hs选项。

您可以使用

 docker history IMAGE_ID 

看看它的各个子组件之间的图像大小是如何分布的。