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

时间:2018-10-12 09:16:45

标签: docker filesystems monitoring

我想监视写在Docker容器内部的数据,这意味着数据由叠加存储驱动程序写入支持文件系统。不会装载写入volumestmpfsbind的数据。典型的监视工具,例如docker stats似乎报告已写入的数据总量。

  

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

来源:docker stats

这个想法是通过找到“大量写入”文件/文件夹并将它们移动到volumesbind mounts来使容器尽可能保持只读。因此,理想的解决方案将不会(仅)显示当前写入的数据,而是显示自容器启动以来写入的数据总量,理想情况下将其分解为单个文件。

目前,我只是从容器外壳中使用find -type f -mtime x,其中x小于图像年龄,但是必须对此有更好的解决方案。

我正在使用:服务器版本:18.06.1-ce,存储驱动程序:overlay2,支持文件系统:extfs

1 个答案:

答案 0 :(得分:5)

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

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

docker overlayFS

来源:How the overlay driver works

写入容器层的数据总量

要完整了解已写入容器的内容,我们只需要查看upperdir,它在后备(主机)文件系统上称为diffdiff文件夹的路径可以通过

找到
docker container inspect <container_name> --format='{{.GraphDriver.Data.UpperDir}}'   # or
docker container inspect <container_name> | grep UpperDir

使用默认设置,此路径指向/var/lib/docker/overlay2/。请注意,要访问docker的“内部工作方式”,需要在主机上进行root访问,并且最好不要对这些文件夹进行任何写操作。

现在我们已经在备份文件系统上拥有了该文件夹,我们可以根据需要简单地du进行详细说明。作为测试示例,我使用了一个运行脚本的alpine图像,该脚本每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
[...]

因此,查看写入容器的所有文件和文件夹就像在任何其他目录下一样容易。