如何分析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'来分析磁盘使用情况。它似乎是有效的,但不是使用“volumes-from”的容器。

例如,我为MongoDB使用了一个仅数据的容器,称为“MongoDB -data”。

当我运行docker run -it --volumes-from mongo-data busybox,然后在容器内运行df -h时,它说安装在/data/db(我的'mongo-data'数据容器)上的文件系统使用11.3G,但当我执行du -h /data/db时,它说它只使用2.1G。

那么,如何分析容器/卷磁盘使用情况呢?或者,在我的情况下,我如何找到'mongo-data'容器大小?

283700 次浏览

(这个答案并不有用,但因为一些评论可能有用,所以把它留在这里)

docker images将显示“虚拟大小”,即包括所有下层的总数。如果容器共享相同的基像,就会重复计算。

文档

因为我上面的评论被隐藏了,所以我把这个作为答案发了出来:

列出容器的大小:

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
< p >编辑: 列出所有正在运行的容器的大小和卷:

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 ps--size参数:

docker ps --size

请记住docker ps --size可能是一个昂贵的命令,需要超过几分钟才能完成。同样适用于容器列表API请求的size=1。最好不要太频繁地运行。

看看我们编译的选择,包括用于docker持久卷目录的du -hs选项。

1.13.0,码头工人包含了一个新的命令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}}) --no-stream来获得:

  1. CPU使用率,
  2. 内存使用量/分配给容器的内存总量(可以通过docker run命令分配)
  3. Mem %
  4. 块I / O
  5. 网络I / O

改进马克西姆的回答:

docker ps --size

你会看到这样的东西:

+---------------+---------------+--------------------+
| CONTAINER ID  | IMAGE         | SIZE               |
+===============+===============+====================+
| 6ca0cef8db8d  | nginx         | 2B (virtual 183MB) |
| 3ab1a4d8dc5a  | nginx         | 5B (virtual 183MB) |
+---------------+---------------+--------------------+

当启动容器时,容器从其启动的映像以只读方式挂载(虚拟) 在此之上,将挂载一个可写层,在该层中对容器所做的任何更改都将被写入 所以虚拟的大小(在例子中是183MB)只被使用一次,不管从同一个映像启动多少个容器——我可以启动1个容器或1000个;没有占用额外的磁盘空间。< br > “Size”(示例中的2B)是每个容器唯一的,因此磁盘上使用的总空间是:

183mb + 5b + 2b

请注意,显示的大小不包括容器使用的所有磁盘空间 目前不包括的东西是;
——卷< br > ——交换< br > ——检查点< br > —用于容器生成日志文件的磁盘空间

https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362

docker ps -size的替代方案

作为“docker ps—size”;在生产环境中,每分钟都运行这样的命令是不可行的。因此,为了获得所需的容器大小,或者更准确地说,rw层的大小对系统性能的影响较小,我们必须做一个变通。

这种方法收集“设备名称”;然后用"df"命令。那些“设备名称”;是被挂载到每个容器上的精简卷。一个问题仍然存在,因为这个观察到的大小也意味着底层图像的所有就绪层。为了解决这个问题,我们可以简单地检查已使用容器映像的大小,并从device/thin_volume的大小中减去它。

应该注意,在使用设备映射器时,每个映像层都是作为一种lvm快照实现的。不幸的是,我不能让我的rhel系统打印出这些快照/层。否则,我们可以简单地收集“最新”的大小;快照。如果有人能把事情说清楚就太好了。然而……

经过一些测试后,创建容器似乎总是会增加大约。40MiB(使用基于Image的容器进行测试):

  1. Docker命令-d——name apache httpd:2.4.46-alpine //现在从Docker中获取设备名称,并使用df进行检查
  2. df -T ->90MB,而“虚拟大小”;源自docker ps——size"状态50MB和非常小的负载2Bytes ->神秘开销40MB
  3. curl/下载容器内100MB的文件
  4. df -T ->190MB,而“虚拟大小”;源自docker ps——size"状态为150MB,有效载荷为100MB ->开销40 mb

下面的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/

这是最简单的方法:

docker ps -s

docker system df命令显示有关docker守护进程使用的磁盘空间量的信息。

docker system df -v