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

标签 docker filesystems monitoring

我想监控写入 Docker 容器“内部”的数据,即覆盖存储驱动程序写入后备文件系统的数据。不是写入 volumestmpfsbind 挂载的数据。典型的监控工具,例如 docker stats 似乎会报告写入的数据总量。

BLOCK I/O The amount of data the container has read to and written from [sic] block devices on the host

来源:docker stats

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

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

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

最佳答案

其实 docker 存储驱动本身已经给出了答案。

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

docker overlayFS

来源:How the overlay driver works

写入容器层的数据总量

要全面了解已写入容器的内容,我们只需查看 upperdir,它在 backing (host) 上称为 diff ) 文件系统。 diff 文件夹的路径可以通过

找到
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
[...]

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

关于Docker:监控磁盘写入容器,即通过覆盖存储驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776244/

相关文章:

python-2.7 - 容器化 celery worker 不会在 docker-compose up 上启动

linux - 加载共享库时出错 : libssl. so.10:无法在 Docker 中打开共享对象文件

linux - while循环cp给出部分文件的副本(linux)

linux - 在 Linux 中用符号链接(symbolic link)替换打开的文件?

java - 文件夹监视器Java代码打印报告两次

amazon-web-services - 我的 Docker 容器在 AWS EC2 Ubuntu 实例上运行。当我转到公共(public) IPv4 DNS 时,我的浏览器显示 "refused to connect."

python - 为桌面环境分发 Docker 容器应用程序

c - 如何获取位于我创建的虚拟文件系统内的文件使用的 block ?

Azure OMS - 心跳测试 - 如果服务器停机超过一天,将不会生成警报

debugging - 如何调试/监控 SMTP 通信?