如何分析Docker容器的磁盘使用情况
我可以看到Docker占用了我12GB的文件系统:如何分析Docker容器的磁盘使用情况,docker,lxc,device-mapper,Docker,Lxc,Device Mapper,我可以看到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 但是,我如何知道这是如
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 bash
然后运行'df-h'来分析磁盘使用情况。它似乎可以工作,但不适用于使用“卷自”的容器
例如,我为MongoDB使用了一个只包含数据的容器,称为“mongo数据”
当我从mongo data busybox运行docker run-it--volumes,然后在容器内运行df-h
时,它会说安装在/data/db
(我的“mongo data”data only容器)上的文件系统使用11.3G,但当我运行du-h/data/db
时,它会说它只使用2.1G
那么,如何分析容器/卷磁盘使用情况?或者,在我的例子中,如何确定“mongo数据”容器的大小?(这个答案没有用处,但将它留在这里,因为一些注释可能是有用的)
docker图像
将显示“虚拟大小”,即包括所有较低层的总大小。因此,如果容器共享相同的基本映像,则会重复计算
将此作为答案发布,因为我上面的评论被隐藏了:
列出容器的大小:
du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>`
注意:根据Docker文件系统(例如“aufs”)更改“devicemapper”卷部分不再工作,因此如果安装了任何人,我只需稍微更改上面的脚本:
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 ps
的--size
参数:
docker ps --size
请记住,docker ps--size
可能是一个代价高昂的命令,需要几分钟以上的时间才能完成。这同样适用于size=1
的容器列表API请求。最好不要太频繁地运行它
看看我们编译的,包括docker持久卷目录的du-hs
选项。在1.13.0之后,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 --verbose
你可以用
docker history IMAGE_ID
查看图像大小如何在其各个子组件之间分配。我使用docker stats$(docker ps--format={{.Names}})--无流
获取:
CPU使用率
内存使用/分配给容器的总内存(可使用docker run命令进行分配)
成员%
块I/O
净I/O
改进Maxime的anwser:
docker ps--尺寸
您将看到如下内容:
+---------------+---------------+--------------------+
| CONTAINER ID | IMAGE | SIZE |
+===============+===============+====================+
| 6ca0cef8db8d | nginx | 2B (virtual 183MB) |
| 3ab1a4d8dc5a | nginx | 5B (virtual 183MB) |
+---------------+---------------+--------------------+
启动容器时,从中启动容器的映像将以只读方式装入(虚拟)
在此之上,安装了一个可写层,其中写入对容器所做的任何更改
因此,虚拟大小(本例中为183MB)仅使用一次,无论从同一图像启动多少个容器-我可以启动1个或1000个容器未使用额外的磁盘空间
不过,每个容器的“大小”(示例中为2B)是唯一的,因此磁盘上使用的总空间为:
183MB+5B+2B
请注意,显示的大小不包括容器使用的所有磁盘空间。
当前未包含的内容包括:
-数量
-交换
-检查点
-用于容器生成的日志文件的磁盘空间
docker ps的替代品--尺寸
由于“docker ps--size”在主机上产生了沉重的IO负载,所以不可能在生产环境中每分钟都运行这样的命令。因此,为了获得所需的容器大小,或者更精确地说,RW层的大小对系统性能的影响较小,我们必须采取变通措施
这种方法收集每个容器的“设备名”,然后使用“df”命令检查其大小。这些“设备名称”是装载到每个容器上的精简配置卷。一个问题仍然存在,因为观察到的大小还意味着基础图像的所有只读层。为了解决这个问题,我们可以简单地检查所用容器图像的大小,并从设备/精简卷的大小中减去它
应该注意的是,在使用设备映射器时,每个图像层都是作为一种lvm快照实现的。不幸的是,我无法让rhel系统打印出这些快照/图层。否则,我们可以简单地收集“最新”快照的大小。如果有人能把事情说清楚就好了。然而
在一些测试之后,似乎创建容器总是会增加约40毫巴的开销(使用基于图像“httpd:2.4.46-alpine”的容器进行测试):
docker run-d——名称apache-httpd:2.4.46-alpine//现在从docker-inspect获取设备名称,并使用df进行查找
df-T->90MB,而“docker ps--Size”中的“虚拟大小”表示50MB,负载非常小,为2字节->40MB
在容器中卷曲/下载100MB文件
df-T->190MB,而“docker ps--Size”中的“虚拟大小”表示150MB,负载为100MB->开销为40MB
下面的shell打印匹配“docker ps--size”结果的结果(以字节为单位)(但请记住前面提到的40MB开销)
以美元计价的c的(docker ps-q);做\
容器_name=$(docker-inspect-f“{.name}}”${c}| sed's/^\///g')\
device_n=$(docker inspect-f“{.GraphDriver.Data.DeviceName}}”${c}sed's/*-//g')\
device_size_kib=$(df-T | grep${device_n}| awk'{print$4}')\
设备大小字节=$((1024*${device大小\u kib}))\
image_sha=$(docker inspect-f“{.image}}”${c}| sed's/*://g')\
image_size_byte=$(docker image inspect-f“{.size}}”${image_sha})\
容器大小字节=$(${device大小字节}-${image大小字节}))\
\
回显我的\u节点\u dm\u设备\u大小\u字节\{cname=\“${container\u name}\”\}${devi
$ docker system df --verbose
docker history IMAGE_ID
+---------------+---------------+--------------------+
| CONTAINER ID | IMAGE | SIZE |
+===============+===============+====================+
| 6ca0cef8db8d | nginx | 2B (virtual 183MB) |
| 3ab1a4d8dc5a | nginx | 5B (virtual 183MB) |
+---------------+---------------+--------------------+
docker ps -s