我可以看到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'来分析磁盘使用情况。它似乎是有效的,但不是使用“volumes-from”的容器。
例如,我为MongoDB使用了一个仅数据的容器,称为“MongoDB -data”。
当我运行docker运行-it——volumes-from mongo-data busybox,然后在容器内df -h,它说文件系统安装在/data/db(我的'mongo-data'数据容器)使用11.3G,但当我做du -h /data/db时,它说它只使用2.1G。
那么,如何分析容器/卷磁盘使用情况呢?或者,在我的情况下,我如何找到'mongo-data'容器大小?
因为我上面的评论被隐藏了,所以我把这个作为答案发了出来:
列出容器的大小:
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')
改进马克西姆的回答:
Docker ps——大小
你会看到这样的东西:
+---------------+---------------+--------------------+
| CONTAINER ID | IMAGE | SIZE |
+===============+===============+====================+
| 6ca0cef8db8d | nginx | 2B (virtual 183MB) |
| 3ab1a4d8dc5a | nginx | 5B (virtual 183MB) |
+---------------+---------------+--------------------+
当启动容器时,容器从其启动的映像被挂载为只读(虚拟)。
在此之上,安装了一个可写层,对容器所做的任何更改都将写入其中。
因此,无论从同一个映像启动多少个容器,Virtual大小(示例中为183MB)都只使用一次——我可以启动1个容器或1000个;没有占用额外的磁盘空间。
“Size”(示例中的2B)是每个容器唯一的,因此磁盘上使用的总空间为:
183mb + 5b + 2b
请注意,显示的大小不包括容器使用的所有磁盘空间。
目前没有包括在内的东西;
——卷
——交换
——检查点
—用于容器生成日志文件的磁盘空间
https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362
docker ps -size的替代方案
由于“docker ps——size”会在主机上产生较大的IO负载,因此在生产环境中每分钟运行该命令是不可行的。因此,为了获得所需的容器大小,或者更准确地说,rw层的大小对系统性能的影响较小,我们必须做一个变通。
这种方法收集每个容器的“设备名称”,然后使用“df”命令检查它的大小。这些“设备名称”是挂载到每个容器上的精简卷。一个问题仍然存在,因为这个观察到的大小也意味着底层图像的所有就绪层。为了解决这个问题,我们可以简单地检查已使用容器映像的大小,并从device/thin_volume的大小中减去它。
应该注意,在使用设备映射器时,每个映像层都是作为一种lvm快照实现的。不幸的是,我不能让我的rhel系统打印出这些快照/层。否则,我们可以简单地收集“最新”快照的大小。如果有人能把事情说清楚就太好了。然而……
经过一些测试后,创建容器似乎总是会增加大约。40MiB(使用基于镜像“httpd:2.4.46-alpine”的容器进行测试):
Docker命令-d——name apache httpd:2.4.46-alpine //现在从Docker中获取设备名称,并使用df进行检查
df - t -> 90MB,而来自“docker ps——Size”的“Virtual Size”表示50MB和一个非常小的2Bytes有效负载->神秘的开销40MB
curl/下载容器内100MB的文件
df - t -> 190MB,而来自“docker ps——Size”的“Virtual Size”表示150MB,有效负载100MB ->开销40MB
下面的shell打印结果(以字节为单位)匹配"docker ps——size"的结果(但请记住前面提到的40MB开销)
for c in $(docker ps -q); do \
container_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}'); \
device_size_byte=$((1024 * ${device_size_kib})); \
image_sha=$(docker inspect -f "{{.Image}}" ${c} | sed 's/.*://g' ); \
image_size_byte=$(docker image inspect -f "{{.Size}}" ${image_sha}); \
container_size_byte=$((${device_size_byte} - ${image_size_byte})); \
\
echo my_node_dm_device_size_bytes\{cname=\"${container_name}\"\} ${device_size_byte}; \
echo my_node_dm_container_size_bytes\{cname=\"${container_name}\"\} ${container_size_byte}; \
echo my_node_dm_image_size_bytes\{cname=\"${container_name}\"\} ${image_size_byte}; \
done
有关设备映射器的进一步阅读:https://test-dockerrr.readthedocs.io/en/latest/userguide/storagedriver/device-mapper-driver/