Docker:监控磁盘写入容器,即通过覆盖存储驱动程序
Docker: Monitor disk writes to the container, i.e. by the overlay storage driver
我想监控写入 "inside" 一个 Docker 容器的数据,这意味着覆盖存储驱动程序写入后备文件系统的数据。不是写入 volumes
、tmpfs
或 bind
装载的数据。典型的监控工具,例如 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
我们的想法是通过查找 "write-heavy" 个文件/文件夹并将它们移动到 volumes
或 bind mounts
来尽可能保持容器只读。因此,理想的解决方案不会(仅)显示当前写入的数据,而是自容器启动以来写入的数据总量,理想情况下将其分解为单个文件。
目前我只是使用容器 shell 中的 find -type f -mtime x
,其中 x
比图像年龄小,但必须有更好的解决方案.
我正在使用:服务器版本:18.06.1-ce,存储驱动程序:overlay2,后备文件系统:extfs
实际上 docker 存储驱动程序本身已经提供了答案。
以overlay2
storage driver为例,这是大多数发行版的默认驱动程序,我们看到container layer
,其中存储了所有写入容器的数据, 保存在单独的文件夹中:
来源:How the overlay driver works
写入容器层的数据总量
要全面了解已写入容器的内容,我们只需看一下 upperdir
,它在后备(主机)文件系统上称为 diff
。
diff
文件夹的路径可以用
找到
docker container inspect <container_name> --format='{{.GraphDriver.Data.UpperDir}}' # or
docker container inspect <container_name> | grep UpperDir
在默认设置下,此路径指向 /var/lib/docker/overlay2/
。请注意,访问 docker 的 "inner workings" 需要在主机上进行 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
[...]
因此,查看写入容器的所有文件和文件夹就像查看任何其他目录一样简单。
我想监控写入 "inside" 一个 Docker 容器的数据,这意味着覆盖存储驱动程序写入后备文件系统的数据。不是写入 volumes
、tmpfs
或 bind
装载的数据。典型的监控工具,例如 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
我们的想法是通过查找 "write-heavy" 个文件/文件夹并将它们移动到 volumes
或 bind mounts
来尽可能保持容器只读。因此,理想的解决方案不会(仅)显示当前写入的数据,而是自容器启动以来写入的数据总量,理想情况下将其分解为单个文件。
目前我只是使用容器 shell 中的 find -type f -mtime x
,其中 x
比图像年龄小,但必须有更好的解决方案.
我正在使用:服务器版本:18.06.1-ce,存储驱动程序:overlay2,后备文件系统:extfs
实际上 docker 存储驱动程序本身已经提供了答案。
以overlay2
storage driver为例,这是大多数发行版的默认驱动程序,我们看到container layer
,其中存储了所有写入容器的数据, 保存在单独的文件夹中:
来源:How the overlay driver works
写入容器层的数据总量
要全面了解已写入容器的内容,我们只需看一下 upperdir
,它在后备(主机)文件系统上称为 diff
。
diff
文件夹的路径可以用
docker container inspect <container_name> --format='{{.GraphDriver.Data.UpperDir}}' # or
docker container inspect <container_name> | grep UpperDir
在默认设置下,此路径指向 /var/lib/docker/overlay2/
。请注意,访问 docker 的 "inner workings" 需要在主机上进行 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
[...]
因此,查看写入容器的所有文件和文件夹就像查看任何其他目录一样简单。