Докер: Мониторинг записи диска в контейнер, т.е. драйвером оверлейного хранилища - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы отслеживать данные, записанные «внутри» контейнера Docker, то есть данные, записанные в резервную файловую систему драйвером оверлейного хранилища.Данные не записываются на volumes, tmpfs или bind монтирования.Типичные инструменты мониторинга, такие как docker stats, по-видимому, сообщают об общем объеме записанных данных.

BLOCK I / O Количество данных, которые контейнер считал и записал с блочных устройств [sic] нахост

Источник: статистика докера

Идея состоит в том, чтобы сделать контейнеры максимально доступными только для чтения, находя файлы / папки с интенсивным доступом для записи, находя «тяжелые для записи» файлы / папки.и перемещая их в volumes или bind mounts.Таким образом, идеальным решением было бы (не только) показывать записанные в данный момент данные, но и общий объем данных, записанных с момента запуска контейнера, в идеале разбивая его на отдельные файлы.

В данный момент я просто используюfind -type f -mtime x из оболочки контейнера, где x меньше возраста изображения, но для этого должно быть лучшее решение.

Я использую: Версия сервера: 18.06.1-ce,Драйвер хранилища: overlay2, файловая система резервного копирования: extfs

1 Ответ

0 голосов
/ 22 октября 2018

На самом деле драйвер хранилища докера уже дает ответ.

Взяв 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

При настройках по умолчанию этот путь указывает на /var/lib/docker/overlay2/.Обратите внимание, что доступ к «внутренней работе» докера требует root доступа на хосте, и это хорошая идея, чтобы не делать никаких записей в эти папки.

Теперь, когда у нас есть папка в файле поддержкиСистема, мы можем просто du в деталях, как мы хотим.В качестве тестового примера я использовал образ alpine , который запускает скрипт, который каждые 10 секунд записывает фиктивный файл размером 10 МБ.

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

Следовательно, просматривая все файлы ипапки, записанные в контейнер, так же просты, как и в любой другой каталог

...