Как очистить устаревшие общие ресурсы Docker ZFS - PullRequest
0 голосов
/ 18 сентября 2018

Сводка

Учитывая, что:

  • Драйвер хранилища docker пользователей - ZFS;
  • Только docker создает legacy наборов данных;

Bash:

$ docker ps -a | wc -l
16

$ docker volume ls | wc -l
12

$ zfs list | grep legacy | wc -l
157

16 контейнеров (как работающих, так и остановленных).12 томов. 157 наборов данных. Это похоже на огромное количество устаревших наборов данных.Мне интересно, если многие из них настолько осиротели, что даже docker не знает о них больше, поэтому они не очищаются.

Обоснование

Огромный списокустаревших томов в моем пуле Debian zfs.Они начали появляться, когда я начал использовать Docker на этом компьютере:

$ sudo zfs list | grep legacy | wc -l
486

Все они имеют вид:

pool/var/<64-char-hash>                  202K  6,18T   818M  legacy

Это местоположение используется исключительно Docker.

$ docker info | grep -e Storage -e Dataset
Storage Driver: zfs
 Parent Dataset: pool/var

Я начал убирать.

$ docker system prune -a
  (...)
$ sudo zfs list | grep legacy | wc -l
154

Так лучше.Тем не менее, я запускаю только около 15 контейнеров, и после запуска docker system prune -a история или каждый контейнер показывает, что только последний слой изображения все еще доступен.Остальные <missing> (потому что они очищены).

$ docker images | wc -l
15

Если все контейнеры используют только последний слой изображения после удаления остальных, не должен докер использовать только 15 слоев изображения и15 работающих контейнеров, всего 30 томов?

$ sudo zfs list | grep legacy | wc -l
154

Могу ли я узнать, используются ли они контейнером / изображением?Есть ли команда, которая обходит все наборы данных pool/var/<hash> в ZFS и выясняет, к какому контейнеру / образу докера они принадлежат?Либо многие из них могут быть удалены, либо я не понимаю, как выяснить (помимо простого доверия docker system prune), что они не могут.

Чрезмерное использование томов zfs докером портит мою zfs listкоманда, как визуально, так и с точки зрения производительности.Перечисление томов zfs теперь занимает ~ 10 секунд вместо <1. </p>

Доказательство того, что докер не видит больше зависающих счетчиков

$ docker ps -qa --no-trunc --filter "status=exited"
  (no output)
$ docker images --filter "dangling=true" -q --no-trunc
  (no output)
$ docker volume ls -qf dangling=true
  (no output)

zfs list пример:

NAME                                                                                       USED  AVAIL  REFER  MOUNTPOINT
pool                                                                                      11,8T  5,81T   128K  /pool
pool/var                                                                                   154G  5,81T   147G  /mnt/var
pool/var/0028ab70abecb2e052d1b7ffc4fdccb74546350d33857894e22dcde2ed592c1c                 1,43M  5,81T  1,42M  legacy
pool/var/0028ab70abecb2e052d1b7ffc4fdccb74546350d33857894e22dcde2ed592c1c@211422332       10,7K      -  1,42M  -
# and 150 more of the last two with different hashes

1 Ответ

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

Чернослив введения на docker.com.

Я полагаю, ваша версия докера ниже, чем V17.06.Поскольку вы выполнили docker system prune -a, информация о зданиях и объемы старых слоев отсутствуют.А флаг -a/--all означает, что все изображения без хотя бы одного контейнера будут удалены.Без флага -a/--all удаляются только оборванные изображения.

Кроме того, я думаю, что вы неправильно понимаете марку <missing> и свисающие изображения.<missing> не означает, что слои, помеченные как отсутствующие, действительно отсутствуют.Это просто означает, что эти слои могут быть построены на других машинах.Висячие изображения не являются ссылками.Даже имя и тег помечены <none>, на изображение все еще могут ссылаться другие изображения, которые можно проверить с помощью docker history image_id.

В вашем случае эти слои помечаются как отсутствующие, поскольку вы удалили старые версии изображений, которые содержат информацию о зданиях.Вы сказали выше - доступны только последние версии изображений - таким образом, только последний слой не помечается как отсутствующий.

Обратите внимание: docker system prune - это ленивый способ управления всеми объектами (изображение / контейнер / том / сеть / кэш) Docker.

...