У меня есть несколько док-контейнеров, работающих на AWS EC2, папка / var / lib / docker / overlay2 очень быстро увеличивается в размере диска.

Интересно, безопасно ли удалять его содержимое? или если в докере есть какая-то команда, чтобы освободить место на диске.


ОБНОВЛЕНИЕ:

Я на самом деле пробовал docker system prune -a уже, что восстановило 0Kb.

Также размер моего диска / docker / overlay2 намного больше, чем вывод из docker system df

Прочитав документацию по докеру и ответ BMitch, я считаю, что трогать эту папку - глупая идея, и я попробую другие способы освободить место на диске.

Ответы (15)

Docker использует / var / lib / docker для хранения ваших образов, контейнеров и локальных именованных томов. Удаление этого может привести к потере данных и, возможно, остановить двигатель. Подкаталог overlay2, в частности, содержит различные уровни файловой системы для изображений и контейнеров.

Чтобы очистить неиспользуемые контейнеры и образы, см. docker system prune. Также есть варианты удаления томов и даже изображений с тегами, но они не включены по умолчанию из-за возможности потери данных:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
  -a, --all             Remove all unused images not just dangling ones
      --filter filter   Provide filter values (e.g. 'label==')
  -f, --force           Do not prompt for confirmation
      --volumes         Prune volumes

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

Что произойдет, если этот совет проигнорируют и вы удалите одну папку, например overlay2, из этой файловой системы? Файловые системы контейнера собраны из набора слоев файловой системы, а папка overlay2 - это то место, где докер выполняет некоторые из этих монтирований (вы увидите их в выводе mount, когда контейнер запущен). Удаление некоторых из них, когда они используются, приведет к удалению фрагментов файловой системы из работающего контейнера и, вероятно, нарушит возможность запуска нового контейнера из поврежденного образа.

Чтобы полностью обновить докер до чистого состояния, остановите движок докера (systemctl stop docker) и удалите весь каталог (а не только папку overlay2) с помощью rm -rf / var / lib / dockerи перезапустите докер (systemctl start docker). Движок перезапустится без каких-либо образов, контейнеров, томов, созданных пользователем сетей или состояния роя.

ВНИМАНИЕ: НЕ ИСПОЛЬЗУЙТЕ В ПРОИЗВОДСТВЕННОЙ СИСТЕМЕ

/# df
...
/dev/xvda1      51467016 39384516   9886300  80% /
...

Хорошо, давайте сначала попробуем системную обрезку

#/ docker system prune --volumes
...
/# df
...
/dev/xvda1      51467016 38613596  10657220  79% /
...

Не так уж и здорово, вроде прибралось несколько мегабайт. Сойдем с ума:

/# sudo su
/# service docker stop
/# cd /var/lib/docker
/var/lib/docker# rm -rf *
/# service docker start
/var/lib/docker# df
...
/dev/xvda1      51467016 8086924  41183892  17% /
...

Отлично! Просто помните, что это НЕ рекомендуется ни на одном сервере, кроме одноразового сервера. На этом этапе внутренняя база данных Docker не сможет найти ни одно из этих наложений, и это может привести к непредвиденным последствиям.

Фон

Вину за проблему можно разделить между неправильной конфигурацией томов контейнеров и проблемой с утечкой (неспособностью освободить) временных данных докера, записанных на эти тома. Мы должны сопоставить (либо с папками хоста, либо с другими требованиями к постоянному хранилищу) все временные папки / журналы / рабочие папки нашего контейнера, в которые наши приложения часто и / или часто пишут. Docker не несет ответственности за очистку всех автоматически создаваемых так называемых EmptyDirs, расположенных по умолчанию в / var / lib / docker / overlay2 / * / diff / *. Содержимое этих «непостоянных» папок должно автоматически очищаться докером после остановки контейнера, но, по-видимому, этого не происходит (их может быть даже невозможно очистить со стороны хоста, если контейнер все еще работает - и он может работать в течение нескольких месяцев. вовремя).

Временное решение

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

Итак, что случилось, так это то, что приложение-виновник (в моем случае clair-scanner) сумело записать за несколько месяцев сотни гигабайт данных во вложенную папку / diff / tmp докеры оверлей2

du -sch /var/lib/docker/overlay2//diff/tmp

271G total

Так как все эти подпапки в / diff / tmp были довольно понятны (все имели форму clair-scanner - * и имели устаревшие даты создания), я остановился связанный контейнер (docker stop clair) и тщательно удалил эти устаревшие подпапки из diff / tmp, осторожно начиная с одного (самого старого) и протестировав влияние на механизм докеров (который потребовался перезапуск [systemctl restart docker] для освобождения места на диске):

rm -rf $(ls -at /var/lib/docker/overlay2//diff/tmp | grep clair-scanner | tail -1)

Я освободил сотни гигабайт дискового пространства без необходимости переустанавливать докер или очищать все его папки. Все запущенные контейнеры должны были быть остановлены в какой-то момент, потому что для освобождения дискового пространства потребовался перезапуск демона докера, поэтому сначала убедитесь, что ваши отказоустойчивые контейнеры работают правильно на / другом узле / ах). Я бы хотел, чтобы команда docker prune могла также покрывать устаревшие данные / diff / tmp (или даже / diff / *) (через еще один переключатель ).

• 100001 100002 *https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604

тоже были проблемы с быстро растущим overlay2

/ var / lib / docker / overlay2 - это папка, в которой docker хранит записываемые слои для вашего контейнера. docker system prune -a - может работать, только если контейнер остановлен и удален.

в моем я смог выяснить, что занимает пространство, зайдя в overlay2 и исследуя.

эта папка содержит другие папки с хеш-именами. в каждой из них есть несколько папок, включая папку diff.

diff папка - содержит фактическую разницу, записанную контейнером с точной структурой папок в качестве вашего контейнера (по крайней мере, так было в моем случае - ubuntu 18 ...)

, поэтому я использовал du -hsc / var / lib / docker / overlay2 / LONGHASHHHHHHH / diff / tmp, чтобы выяснить, что / tmp внутри моего контейнера - это папка, которая загрязняется.

, поэтому в качестве обходного пути я использовал -v / tmp / container-data / tmp: / tmp параметр для docker run команду для сопоставления внутреннего / tmp * Папка 100007 * для размещения и настройка cron на хосте для очистки этой папки.

задача cron была простой:

  • sudo nano /etc/crontab
  • */30 * * * * root rm -rf /tmp/container-data/tmp/*
  • save and exit

NOTE: overlay2 is system docker folder, and they may change it structure anytime. Everything above is based on what i saw in there. Had to go in docker folder structure only because system was completely out of space and even wouldn't allow me to ssh into docker container.

НЕ ДЕЛАЙТЕ ЭТОГО В ПРОИЗВОДСТВЕ

Ответ @ ravi-luthra технически работает, но имеет некоторые проблемы!

В моем случае я просто пытался освободить место на диске. Папка lib / docker / overlay занимала 30 ГБ места, и я регулярно запускаю только несколько контейнеров. Похоже, у докера есть проблема с утечкой данных, и некоторые временные данные не очищаются при остановке контейнера.

Итак, я удалил все содержимое папки lib / docker / overlay. После этого экземпляр My docker стал непригодным для использования. Когда я пытался запустить или построить какой-либо контейнер, я получил эту ошибку:

failed to create rwlayer: symlink ../04578d9f8e428b693174c6eb9a80111c907724cc22129761ce14a4c8cb4f1d7c/diff /var/lib/docker/overlay2/l/C3F33OLORAASNIYB3ZDATH2HJ7: no such file or directory

Затем методом проб и ошибок я решил эту проблему, запустив

(WARNING: This will delete all your data inside docker volumes)

docker system prune --volumes -a

So It is not recommended to do such dirty clean ups unless you completely understand how the system works.

docker system prune -af && docker image prune -af

Друзья, чтобы все было в чистоте, вы можете использовать команды:

docker system prune -a && docker volume prune

добавление к приведенному выше комментарию, в котором люди предлагают сократить систему, например очистить оборванные тома, изображения, контейнеры для выхода и т. Д. Иногда ваше приложение становится виновником, оно генерирует слишком много журналов за короткое время, и если вы используете пустой каталог volume (локальные тома) заполняет разделы / var. В этом случае мне показалось, что приведенная ниже команда очень интересна, чтобы выяснить, что занимает место на моем диске с разделом / var.

du -ahx /var/lib | sort -rh | head -n 30

Эта команда выведет список из 30 первых, которые занимают больше всего места на одном диске. Означает, что если вы используете внешнее хранилище со своими контейнерами, на выполнение команды du уходит много времени. Эта команда не будет считать подключенные тома. И намного быстрее. Вы получите точные каталоги / файлы, которые занимают место. Затем вы можете перейти в эти каталоги и проверить, какие файлы полезны или нет. если эти файлы требуются, вы можете переместить их в какое-либо постоянное хранилище, внеся изменения в приложение, чтобы использовать постоянное хранилище для этого местоположения, или изменив местоположение этих файлов. А для отдыха вы можете их очистить.

Docker явно хранит слои образа старых версий образа для запуска контейнеров. Это может произойти, если вы обновите изображение работающего контейнера (тот же тег), не останавливая его, например:

сборка докеров
docker-compose up -d

Запуск docker-compose down перед обновлением решил это, простои в моем случае не проблема.

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

Сделайте так:

sudo bash
cd /var/lib/docker
find . -type f | xargs du -b  | sort -n

Вы увидите самые большие файлы, показанные внизу. Если хотите, выясните, в каких контейнерах находятся эти файлы, введите эти контейнеры с помощью docker exec -ti имя-контейнера - / bin / sh и удалите несколько файлов.

Вы также можете поместить docker system prune -a -f в ежедневное / еженедельное задание cron, если вы не оставляете остановленные контейнеры и тома вокруг, которые вам небезразличны. Лучше выяснить причины, по которым он растет, и исправить их на уровне контейнера.

У меня была такая же проблема, в моем случае это было потому, что каталог var / lib / docker был смонтирован в работающий контейнер (в моем случае google / cadvisor), поэтому он заблокировал очистку папки docker prune. Остановка контейнера, запуск docker prune и повторный запуск контейнера решили проблему.

У меня была эта проблема ... Это был огромный журнал. Логи находятся здесь:

/var/lib/docker/containers//-json.log

Вы можете управлять этим в командной строке запуска или в файле создания. Смотрите там: Настроить драйверы логирования

Я лично добавил эти 3 строки в свой файл docker-compose.yml:

my_container:
  logging:
    options:
      max-size: 10m

Мне показалось, что это работает лучше всего:

docker image prune --all

По умолчанию Docker не удаляет именованные образы, даже если они не используются. Эта команда удалит неиспользуемые изображения.

Обратите внимание, что каждый слой изображения - это папка внутри папки / usr / lib / docker / overlay2 /.

Я использовал "docker system prune -a" он очистил все файлы под томами и оверлей2

    [root@jasontest volumes]# docker system prune -a
    WARNING! This will remove:
            - all stopped containers
            - all networks not used by at least one container
            - all images without at least one container associated to them
            - all build cache
    Are you sure you want to continue? [y/N] y
    Deleted Images:
    untagged: ubuntu:12.04
    untagged: ubuntu@sha256:18305429afa14ea462f810146ba44d4363ae76e4c8dfc38288cf73aa07485005
    deleted: sha256:5b117edd0b767986092e9f721ba2364951b0a271f53f1f41aff9dd1861c2d4fe
    deleted: sha256:8c7f3d7534c80107e3a4155989c3be30b431624c61973d142822b12b0001ece8
    deleted: sha256:969d5a4e73ab4e4b89222136eeef2b09e711653b38266ef99d4e7a1f6ea984f4
    deleted: sha256:871522beabc173098da87018264cf3e63481628c5080bd728b90f268793d9840
    deleted: sha256:f13e8e542cae571644e2f4af25668fadfe094c0854176a725ebf4fdec7dae981
    deleted: sha256:58bcc73dcf4050a4955916a0dcb7e5f9c331bf547d31e22052f1b5fa16cf63f8
    untagged: osixia/openldap:1.2.1
    untagged: osixia/openldap@sha256:6ceb347feb37d421fcabd80f73e3dc6578022d59220cab717172ea69c38582ec
    deleted: sha256:a562f6fd60c7ef2adbea30d6271af8058c859804b2f36c270055344739c06d64
    deleted: sha256:90efa8a88d923fb1723bea8f1082d4741b588f7fbcf3359f38e8583efa53827d
    deleted: sha256:8d77930b93c88d2cdfdab0880f3f0b6b8be191c23b04c61fa1a6960cbeef3fe6
    deleted: sha256:dd9f76264bf3efd36f11c6231a0e1801c80d6b4ca698cd6fa2ff66dbd44c3683
    deleted: sha256:00efc4fb5e8a8e3ce0cb0047e4c697646c88b68388221a6bd7aa697529267554
    deleted: sha256:e64e6259fd63679a3b9ac25728f250c3afe49dbe457a1a80550b7f1ccf68458a
    deleted: sha256:da7d34d626d2758a01afe816a9434e85dffbafbd96eb04b62ec69029dae9665d
    deleted: sha256:b132dace06fa7e22346de5ca1ae0c2bf9acfb49fe9dbec4290a127b80380fe5a
    deleted: sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659
    untagged: centos:centos7
    untagged: centos@sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
    deleted: sha256:ff426288ea903fcf8d91aca97460c613348f7a27195606b45f19ae91776ca23d
    deleted: sha256:e15afa4858b655f8a5da4c4a41e05b908229f6fab8543434db79207478511ff7

    Total reclaimed space: 533.3MB
    [root@jasontest volumes]# ls -alth
    total 32K
    -rw-------  1 root root  32K May 23 21:14 metadata.db
    drwx------  2 root root 4.0K May 23 21:14 .
    drwx--x--x 14 root root 4.0K May 21 20:26 ..

Недавно у меня была аналогичная проблема, overlay2 становился все больше и больше, но я не мог понять, что занимало большую часть пространства.

df показал мне, что overlay2 имеет размер около 24 ГБ.

С помощью du я попытался выяснить, что занимает пространство ... и потерпел неудачу.

Разница в том, что удаленные файлы (в моем случае в основном файлы журналов) все еще используются процессом (Docker). Таким образом, файл не отображается с du, но пространство, которое он занимает, будет отображаться с df.

Помогла перезагрузка хост-машины. Перезапуск контейнера докеров, вероятно, уже помог бы ... Эта статья на linuxquestions.org помогла мне в этом разобраться.

2022 WebDevInsider