Чому образ докера поглинає мій простір на диску, який не використовується докером


82

У мене встановлений докер, і я використовував зовсім інший блоковий пристрій для зберігання системних даних докера:

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

Зверніть увагу, що /disk/1використовується зовсім інший жорсткий диск/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

Проблема полягає в тому, що коли я продовжую завантажувати образи докера та запускаю контейнери докера, здається, що інший жорсткий диск /dev/xvda1також витрачений.

Я можу перевірити цю проблему, видаливши деякі зображення докера. Після того, як я видалив кілька зображень докера, зараз /dev/xvda1є додатковий простір.

Мені чогось не вистачає?

Моя версія докера:

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09

Ви можете опублікуватиfdisk -l
user2915097

Відповіді:


64

Це проблема ядра з devicemapper, яка впливає на сімейство ОС RedHat (RedHat, Fedora, CentOS та Amazon Linux). Видалені контейнери не звільняють відображене місце на диску. Це означає, що на уражених ОС у вас буде повільно закінчуватися місце під час запуску та перезапуску контейнерів.

Проект Docker знає про це, і ядро, нібито, зафіксовано в висхідній течії ( https://github.com/docker/docker/issues/3182 ).

Різновидом роботи є надання Docker власному тому для запису ( "Коли Docker з'їдає вам місце на диску" ). Це насправді не заважає їй їсти простір, а просто знімати інші частини вашої системи після цього.

Моє рішення було видалити docker, потім видалити всі його файли, а потім перевстановити:

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

Це повернуло мій простір, але це не сильно відрізняється від простого запуску замінного екземпляра. Я не знайшов більш приємного рішення.


20
Я щойно пройшов те саме, і вам не потрібно видаляти докер. Мені потрібно було лише зупинити докер, видалити каталог, а потім запустити докер.
blockcipher

2
Який каталог? / var / lib / docker? Якщо я це роблю, я втрачаю свій імідж. Якщо я спробую спочатку зберегти зображення у файлі .tar, і це теж не вдається: Помилка монтажу '/ dev / mapper / docker-202: ... помилка вводу / виводу
Тобі

5
@Toby так /var/lib/docker, який видалить усі ваші зображення та контейнери. Ви важко скидаєте Docker, тому не сподівайтесь, що зможете зберегти всі свої речі.
Натаніель Вайсброт

61

Видалення мого цілого / var / lib / docker для мене не є нормальним. Це більш безпечні способи:

Рішення 1:

Наступні команди від випуску очистити місце для мене , і це набагато безпечніше , ніж видалення / вар / Бібліотека / докер або для Windows , перевірте дисковий розташування зображення тут .

До:

docker info

Приклад виводу:

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

Команда в нових версіях Docker, наприклад, 17.x +

docker system prune -a

Він покаже вам попередження про те, що він видалить усі зупинені контейнери, мережі, зображення та побудує кеш. Як правило, це безпечно видалити. (Наступного разу, коли ви запустите контейнер, він може витягнути з реєстру Docker)

Приклад виводу:

Total reclaimed space: 1.243GB

Потім ви можете знову запустити інформацію про докер, щоб побачити, що було очищено

docker info

Рішення 2:

Поряд із цим переконайтесь, що ваші програми всередині контейнера докера не записують у файлову систему багато / величезних файлів.

Перевірте розмір використовуваного місця вашого запуску докера

docker ps -s #may take minutes to return

або для всіх контейнерів, навіть вийшов

docker ps -as #may take minutes to return

Потім ви можете видалити контейнер (и), що порушує право

docker rm <CONTAINER ID>

Знайдіть можливого винуватця, який може використовувати концерти космосу

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

У моєму випадку програма писала концерти тимчасових файлів.

( Натаніель Вайсброт згадував у прийнятій відповіді на це питання, і я отримав деяку інформацію з цього питання)


АБО

Команди у старих версіях Docker, наприклад, 1.13.x (запускати як root, а не sudo):

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

Після:

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB

2
docker system prune --forceце, безумовно, найбезпечніший варіант, який я бачив із відповідей. У мене не вистачало місця на машині. Вирізав, і тепер у мене 50 Гб безкоштовно ... хоч би я це знав раніше
costrouc

4
Голоси за цю відповідь свідчать про те, що люди вважають це корисним. Однак, щоб зрозуміти, це відповідає на дещо інше питання "Як я можу повернути місце, яке використовує Docker?" тоді як питання полягало в тому, щоб Докер використовував простір, але потім сказав, що він цього не зробив (так pruneмарно, бо Докер не бачить, що обрізати)
Натаніель Вайсброт,

6

Перемістіть /var/lib/dockerкаталог.

Якщо припустити, що в /dataкаталозі є достатньо місця, якщо ні, то замість того, що є,

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

Таким чином, вам не доведеться переналаштовувати докер.


6

Була та сама проблема. У моєму сценарії мій vbox закінчував місце для зберігання. Після розслідування з'ясувалося, що мій докер місцевих обсягів з'їдає 30 гб. Хост Ubuntu 16.04.

Щоб дізнатися своє.

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

Це звільняє місце на диску невикористаних локальних томів. За моїм сценарієм звільнено 20 ГБ місця для зберігання. Переконайтеся, що контейнери, які ви хочете зберегти, працюють, перш ніж робити це, якщо ви хочете зберегти їх, оскільки це видаляє всі зупинені контейнери.


Це не відповідає безпосередньо на вихідне запитання, але корисно в подібному сценарії.
BearOakheart

5

У мене була подібна проблема, і я думаю, що це трапляється, коли на диску недостатньо місця для всіх зображень докера. У мене було 6 Гб, зарезервованих для докер-зображень, яких, як виявилося, недостатньо в моєму випадку. У будь-якому випадку, я видалив кожне зображення та контейнер, і диск все ще виглядав заповненим. Більшу частину місця використовували / var / lib / docker / devicemapper та / var / lib / docker / tmp.

Ця команда для мене не спрацювала:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

По-перше, я зупинив службу докера:

sudo service docker stop

Потім я видалив / var / lib / docker:

Потім я зробив те, що хтось запропонував тут, https://github.com/docker/docker/issues/18867#issuecomment-232301073

  • Видаліть існуючий екземпляр метаданих docker rm -rf / var / lib / docker

    sudo rm -rf / var / lib / docker

  • Передайте наступні опції демону докера: -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = discard

  • Запустити демон Docker.

Останні два кроки я виконую:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

4

Обрізання Docker за замовчуванням не видаляє томи,

ви можете спробувати щось на зразок

docker volume prune -f

система докерів prune --volumes працює ідеально. Раніше це було - обсяг, а зараз - обсяги.
Зеб Девіс,

6
docker system prune --all --volumes
Девід Портабелла,

3

Як згадувалося у випуску # 18867 - Видалення даних у програмі-програмі контейнера не може звільнити використаний простір із Github.com

Спробуйте виконати наведену нижче команду:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

Він використовує цей fstrimінструмент для обрізки тонкодоступного диска програми програвача.


Це спрацювало для мене. Ймовірно тому, що використання devicemapper у циклічному режимі.
zeroimpl

0

можливо, ви можете спробувати docker system pruneвидалити всі важливі зображення


0

Для тих, хто стикається з цією проблемою в MacOS, рішення, яке спрацювало для мене, було шукати файл Docker.raw, який Docker використовує для резервування логічного простору в хості, а потім видалення. Якщо у вас є Docker Desktop, ви можете перейти:

Preferences -> Resources -> Advancedа потім загляньте під Disk image locationвкладку.

Перейдіть до цієї папки в терміналі та просто видаліть Docker.rawфайл ( $ rm -rf Docker.raw)

Важливе зауваження : робіть це лише для того, щоб вам не потрібні будь-які наявні зображення чи томи.


-1

Так, Docker використовує папку / var / lib / docker для зберігання шарів. Є способи повернути місце та перемістити сховище в інший каталог.

Ви можете встановити більший простір на диску та перемістити вміст / var / lib / docker до нового місця монтування та зробити посилання sym.

Існує детальне пояснення того, як виконати вищевказане завдання.

http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

Ви також можете видалити проміжні шари.

https://github.com/vishalvsh1/docker-image-cleanup

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.