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

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
ming.kernel
источник
fdisk -l
Можете

Ответы:

64

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

Проект Docker знает об этом, и ядро ​​предположительно исправлено в апстриме ( https://github.com/docker/docker/issues/3182 ).

Своего рода обходной путь - предоставить 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 yes /var/lib/docker, что удалит все ваши изображения и контейнеры. Вы полностью сбрасываете Docker, поэтому не ожидайте, что сможете сохранить все свои вещи.
Натаниэль Вайсброт
61

Мне не подходит удаление всего / var / lib / docker. Это более безопасные способы:

Решение 1:

Следующие команды из этой проблемы освобождают для меня место, и это намного безопаснее, чем удаление / var / lib / docker или для 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
rjdkolb
источник
2
docker system prune --forceэто определенно самый безопасный вариант, который я когда-либо видел. На моей машине не хватало места. Обрезал, и теперь у меня 50 ГБ свободного места ... Хотел бы я знать об этом раньше
costrouc
4
Голосование за этот ответ указывает на то, что люди считают его полезным. Однако для ясности: это ответ на несколько иной вопрос: «Как я могу освободить пространство, которое использует Docker?» тогда как вопрос был о Docker, использующем пространство, но затем о том, что это не так (это pruneбесполезно, потому что Docker не видит ничего, что можно было бы обрезать)
Натаниэль Вайсброт
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

  • Удалить существующий экземпляр метаданных докеров rm -rf / var / lib / docker

    sudo rm -rf / var / lib / докер

  • Передайте следующие параметры демону docker: -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = discard

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

На последних двух шагах я бегу:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard
Родолк
источник
4

Docker prune по умолчанию не удаляет тома,

вы можете попробовать что-то вроде

docker volume prune -f
Нирбхай Шах
источник
docker system prune --volumes работает отлично. Раньше это было --volume, но теперь --volumes.
Зеб Дэвис
6
docker system prune --all --volumes
Дэвид
3

Как упоминалось в проблеме № 18867 - Удаление данных в контейнере devicemapper не может освободить используемое пространство с Github.com.

Попробуйте выполнить следующую команду:

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

Он использует этот fstrimинструмент для обрезки диска с тонким предоставлением devicemapper.

Цзян Цзюнь
источник
Это сработало для меня. Вероятно, из-за использования 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 в новое место монтирования и создать символьную ссылку.

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

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

Вы также можете удалить промежуточные слои.

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

Vishal Sahasrabuddhe
источник