Docker:监视磁盘写入容器,即通过覆盖存储驱动程序

hjs*_*son 7 filesystems monitoring docker

我想监视"内部"写入Docker容器的数据,这意味着数据由覆盖存储驱动程序写入后备文件系统.没有数据写入volumes,tmpfs或者bind坐骑.典型的监控工具,例如docker stats似乎报告写入的数据总量.

BLOCK I/O容器从主机上的[sic]块设备读取和写入的数据量

来源:docker stats

我们的想法是通过查找"重写"文件/文件夹并将它们移动到volumes或,将容器保持为只读bind mounts.因此,理想的解决方案不会(仅)显示当前写入的数据,而是自容器启动以来写入的数据总量,最好将其分解为单个文件.

目前我只是find -type f -mtime x在容器外壳中使用,它x比图像时代小,但必须有一个更好的解决方案.

我正在使用:服务器版本:18.06.1-ce,存储驱动程序:overlay2,Backing Filesystem:extfs

hjs*_*son 5

实际上,docker存储驱动程序本身就已经提供了答案.

以overlay2 存储驱动程序(大多数发行版的默认驱动程序)为例,我们看到container layer写入容器的所有数据都存储在一个单独的文件夹中:

docker overlayFS

来源:叠加驱动程序的工作原理

写入容器层的数据总量

有关已写入容器的内容的完整概述,我们只需要查看在后备(主机)文件系统上upperdir调用的diff内容.diff可以找到该文件夹的路径

docker container inspect <container_name> --format='{{.GraphDriver.Data.UpperDir}}'   # or
docker container inspect <container_name> | grep UpperDir
Run Code Online (Sandbox Code Playgroud)

使用默认设置,此路径指向/var/lib/docker/overlay2/.请注意,访问docker的"内部工作"需要root访问主机,最好不要对这些文件夹进行任何写入操作.

现在我们在后备文件系统上有了这个文件夹,我们可以根据需要简单du地详细说明.作为测试示例,我使用了运行脚本的高山图像,该脚本每10秒写一个10 MB的虚拟文件.

root@testbox:/var/lib/docker/overlay2/83a825d...# du -h -d 1
8.0K    ./work
216M    ./diff
216M    .
root@testbox:/var/lib/docker/overlay2/83a825d...# ll diff/tmp
total 220164
drwxrwxrwt 2 root root    4096 Okt 21 22:57 ./
drwxr-xr-x 3 root root    4096 Okt 21 22:53 ../
-rw-r--r-- 1 root root 9266613 Okt 21 22:53 dummy0.tar.gz
-rw-r--r-- 1 root root 9266613 Okt 21 22:55 dummy10.tar.gz
-rw-r--r-- 1 root root 9266613 Okt 21 22:55 dummy11.tar.gz
[...]
Run Code Online (Sandbox Code Playgroud)

因此,查看写入容器的所有文件和文件夹就像使用任何其他目录一样简单.