Подтвердить что ты не робот

Чистая среда докеров: devicemapper

У меня есть докерная среда с двумя контейнерами (Jenkins и Nexus, как со своим именованным томом). У меня есть ежедневное задание cron, которое удаляет неиспользуемые контейнеры и изображения. Это работает нормально. Но проблема в моем devicemapper:

du -sh /var/lib/docker/
30G docker/

Я могу каждую папку в моей папке докеров: Объемы (большие, но это нормально в моем случае):

/var/lib/docker# du -sh volumes/
14G volumes/

Контейнеры:

/var/lib/docker# du -sh containers/
3.2M    containers/

Изображения:

/var/lib/docker# du -sh image/
5.8M    image/

Devicemapper:

/var/lib/docker# du -sh devicemapper/
  16G   devicemapper/

/var/lib/docker/devicemapper/mnt составляет 7,3 г /var/lib/docker/devicemapper/devicemapper составляет 8.1G

Информация о докере:

Storage Driver: devicemapper
 Pool Name: docker-202:1-xxx-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: ext4
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 5.377 GB
 Data Space Total: 107.4 GB
 Data Space Available: 28.8 GB
 Metadata Space Used: 6.148 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.141 GB
 Udev Sync Supported: true

Что это за пространство, и я могу очистить его, не разбирая вещи?

4b9b3361

Ответ 1

Не используйте файл цикла devicemapper для чего-то серьезного! Докер предупреждает об этом.

Каталог /var/lib/docker/devicemapper/devicemapper содержит файлы разреженных циклов, которые содержат все данные, которые монтирует докер. Таким образом, вам нужно будет использовать инструменты lvm, чтобы рыскать вокруг них и что-то делать. Прочтите вопросы об удалении с devicemapper, они вроде как решены, но, возможно, нет.

Я бы отошел от devicemapper, где это возможно, или использовал бы тонкие пулы LVM на чем-нибудь основанном на RHEL. Если вы не можете изменить драйверы хранилища, эта же процедура, по крайней мере, очистит любое выделенное пространство, которое вы не сможете восстановить.

Изменение драйвера хранилища док-станции

Для изменения драйвера хранилища потребуется сбросить каталоги /var/lib/docker, в которых содержатся все данные докера. Есть способы сохранить его части, но это включает в себя возиться с внутренностями Docker. Лучше зафиксировать и экспортировать любые контейнеры или тома, которые вы хотите сохранить, и импортировать их после изменения. В противном случае у вас будет новая, чистая установка Docker!

  1. Экспорт данных

  2. Стоп Докер

  3. Удалить /var/lib/docker

  4. Измените запуск Docker, чтобы использовать новый драйвер хранилища. Установите --storage-driver=<name> в /lib/systemd/system/docker.service или /etc/systemd/system/docker.service или /etc/default/docker или /etc/sysconfig/docker

  5. Запустить Docker

  6. Импорт данных

AUFS

AUFS не находится в основном ядре (и никогда не будет), что означает, что дистрибутив должен как-то активно его включать. Для Ubuntu это в пакетах linux-image-extra.

apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

Затем измените параметр драйвера хранилища на --storage-driver=aufs

OverlayFS

OverlayFS уже доступна в Ubuntu, просто измените драйвер хранилища на --storage-driver=overlay2 или --storage-driver=overlay, если вы все еще используете ядро 3.x

Я не уверен, насколько хорошая идея это прямо сейчас. Это не может быть намного хуже, чем файл цикла, но Драйвер overlay2 достаточно надежен для использования разработчиками, но еще не считается готовым к работе (например, Docker Enterprise не обеспечивает поддержку), но его подталкивают к тому, чтобы он стал стандартным драйвером из-за проблем AUFS/Kernel.

Тонкий бассейн с прямой LVM

Вместо файла цикла devicemapper вы можете напрямую использовать тонкий пул LVM. RHEL облегчает эту задачу с помощью утилиты docker-storage-setup, которая поставляется вместе с пакетом докеров EPEL. В Docker есть подробные инструкции по настройке томов вручную.

--storage-driver=devicemapper \
--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \
--storage-opt dm.use_deferred_removal=true

Docker 17. 06+ поддерживает управление простыми настройками блочного устройства direct-lvm.

Просто не хватит места в томе LVM, никогда. В результате вы получаете не отвечающий на запросы демон Docker, который необходимо уничтожить, а затем ресурсы LVM, которые все еще используются, которые трудно очистить.

Ответ 2

Сначала что такое devicemapper (официальная документация)

Устройство Mapper включено в основное ядро ​​Linux с версии 2.6.9. Это основная часть семейства дистрибутивов Linux RHEL.

Драйвер devicemapper хранит каждое изображение и контейнер на своем собственном виртуальном устройстве. Эти устройства представляют собой устройства для создания снимков с копированием на запись с тонким резервированием.
Технология Device Mapper работает на уровне блоков, а не на уровне файлов. Это означает, что драйверы devicemapper для тонких операций резервного копирования и копирования на запись работают с блоками, а не целыми файлами.

Devicemapper является стандартным драйвером хранения Docker в некоторых дистрибутивах Linux.

Докеры-хосты запускают драйвер хранилища devicemapper по умолчанию для режима конфигурации, известного как loop-lvm. Этот режим использует разреженные файлы для создания тонкого пула, используемого для моментальных снимков изображений и контейнеров.

Докеры 1.10 и более поздние уже не соответствуют идентификаторам уровня изображения с именами каталогов в /var/lib/docker.
Однако есть два ключевых каталога.

  • Каталог /var/lib/docker/devicemapper/mnt содержит точки монтирования для слоев изображения и контейнера.
  • Каталог /var/lib/docker/devicemapper/metadatirectory содержит один файл для каждого снимка образа и моментального снимка контейнера.

Если ваш docker info показывает, что ваш Storage Driver равен devicemapper (а не aufs), будьте осторожны с этими папками.
См. Например вопрос 18867.

Ответ 3

Я столкнулся с той же проблемой, когда в моем /var/lib/docker/devicemapper/devicemapper/data файл достигал ~ 91% корневого тома (~ 45G из 50G). Я пытался удалить все ненужные изображения, удаленные тома, ничего не помогло в уменьшении этого файла.

Несколько прогуглил и понял, что файлы "data" - это редкие файлы, монтируемые в петле, и Docker использует их для хранения мест монтирования и других файлов, которые мы бы хранили в контейнерах.

Наконец, я удалил все изображения, которые запускались раньше, и остановил

Docker RM $ (Docker PS -aq)

Значительно уменьшен файл devicemapper. Надеюсь, это поможет вам ,

Ответ 4

Периодический docker system prune -a работает для меня в системах, где я использую devicemapper, а не LVM thinpool. Шаблон, который я использую:

  • Я помечаю любые контейнеры, изображения и т.д. Ярлыком "protected", если хочу, чтобы они были освобождены от очистки
  • Затем я периодически запускаю docker system prune -a --filter=label!=protected (вручную или cron с -f)

Маркировка примеров:

  • docker run --label protected ...
  • docker create --label=protected=true ...
  • Для изображений: Dockerfile LABEL, например LABEL protected=true
  • Чтобы добавить метку к существующему изображению, которую я не могу с легкостью перестроить, я создаю двухстрочный Docker файл с вышеописанным, создаю новое изображение, а затем переключаю новое изображение на старое (тег).

Генеральная докерская этикеточная документация