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

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

[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 также израсходован.

Я могу проверить эту проблему, удалив некоторые образы докеров. После того, как я удалил некоторые образы Docker, у /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

person ming.kernel    schedule 09.01.2015    source источник
comment
можешь опубликовать fdisk -l   -  person user2915097    schedule 09.01.2015


Ответы (10)


Это проблема ядра с 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

Это вернуло мое пространство, но это не сильно отличается от простого запуска заменяющего экземпляра. Более приятного решения я не нашел.

person Nathaniel Waisbrot    schedule 12.01.2015
comment
Я только что прошел через то же самое, и вам не нужно удалять докер. Все, что мне нужно было сделать, это остановить докер, удалить каталог, а затем запустить докер. - person blockcipher; 16.01.2015
comment
Какой каталог? /вар/библиотека/докер? Если я это сделаю, я потеряю свой имидж. Если я попытаюсь сначала сохранить образ в файл .tar, это тоже не удастся: Ошибка монтирования '/dev/mapper/docker-202:... ошибка ввода/вывода - person Toby; 07.02.2016
comment
@Toby yes /var/lib/docker, который удалит все ваши изображения и контейнеры. Вы выполняете жесткую перезагрузку Docker, поэтому не ожидайте, что сможете сохранить все свои вещи. - person Nathaniel Waisbrot; 08.02.2016

Мне не подходит удаление всего файла /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

В моем случае программа записывала гиги временных файлов.

(Натаниэль Вайсброт упомянул в принятом ответе этот issue, и я получил некоторую информацию об этой проблеме)


ИЛИ

Команды в старых версиях 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
person rjdkolb    schedule 01.02.2017
comment
docker system prune --force определенно самый безопасный вариант ответов, который я видел. Мне не хватило места на моей машине. Сделал обрезку, и теперь у меня есть 50 Гб свободного места... Жаль, что я не знал об этом раньше - person costrouc; 23.04.2018
comment
Голоса за этот ответ показывают, что люди считают его полезным. Просто для ясности, это ответ на немного другой вопрос. Как я могу вернуть пространство, которое использует Docker? тогда как вопрос был о том, что Docker использует пространство, но затем сказал, что это не так (поэтому prune бесполезен, потому что Docker не видит ничего, что нужно обрезать) - person Nathaniel Waisbrot; 25.04.2019

Переместите каталог /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

Таким образом, вам не нужно перенастраивать docker.

person Ajay Sharma    schedule 05.04.2016

Была такая же проблема. В моем сценарии в моем 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 ГБ дискового пространства. Прежде чем делать это, убедитесь, что контейнеры, которые вы хотите сохранить, работают, если вы хотите их сохранить, поскольку при этом будут удалены все остановленные контейнеры.

person BearOakheart    schedule 13.12.2019
comment
Это не отвечает напрямую на исходный вопрос, но полезно в аналогичном сценарии. - person BearOakheart; 13.12.2019

У меня была похожая проблема, и я думаю, что это происходит, когда у вас недостаточно места на диске для всех ваших образов докеров. У меня было зарезервировано 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
person rodolk    schedule 04.04.2017

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

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

docker volume prune -f
person Nirbhay Shah    schedule 17.04.2019
comment
docker system prune --volumes работает отлично. Раньше это было --volume, а теперь --volumes. - person Zeb Davis; 16.05.2019

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

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

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

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

person Jiang Jun    schedule 12.10.2016
comment
Это сработало для меня. Скорее всего из-за использования devicemapper в циклическом режиме. - person zeroimpl; 30.09.2018

Для тех, кто сталкивается с этой проблемой в MacOS, решение, которое сработало для меня, состояло в том, чтобы найти файл Docker.raw, который Docker использует для резервирования логического пространства на хосте, а затем удалить его. Если у вас есть Docker Desktop, вы можете:

Preferences -> Resources -> Advanced, а затем посмотрите на вкладку Disk image location.

Перейдите в эту папку в терминале и просто удалите файл Docker.raw ($ rm -rf Docker.raw)

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

person Cesar Flores    schedule 19.12.2020

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

person Max    schedule 26.02.2019

Да, 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

person vishal sahasrabuddhe    schedule 29.06.2016