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

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

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

[[email protected] /]# 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 имеет еще некоторое дополнительное пространство.

Я что-то пропустил?

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

[[email protected] /]# 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
4b9b3361

Ответ 1

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

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

Ответ 2

Удаление всего моего /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, чтобы увидеть, что было очищено

docker info

Решение 2:

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

Проверьте размер используемого пространства процесса запуска Docker

docker ps -s #may take minutes to return

или для всех контейнеров, даже выход из

docker ps -as #may take minutes to return

Затем вы можете удалить нарушающий контейнер /s

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

Ответ 3

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

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

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

За последние два шага я запускаю:

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

Ответ 4

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

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

Ответ 5

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

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

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

Он использует инструмент fstrim, чтобы обрезать тонкий диск с devicemapper.

Ответ 6

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

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

docker system prune --volume

Ответ 7

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

Ответ 8

Система очистки Prcker --volumes работает отлично. Раньше это было --volume, но сейчас --volumes.

Ответ 9

Эта проблема периодически возникала в моей MacOS с Engine: 19.03.2. В моем случае восстановление изображения занимает много времени и не является возможным вариантом. Поэтому удаление изображений/обрезка не было возможным.

Решением было сохранить изображение в tar, удалить изображение, выйти из Docker, перезагрузить изображение из файла tar. Команды для каждого шага, как показано ниже.

  1. docker save -o <name>.tar <image-name>
  2. docker rmi <image-name>
  3. Выйти из Docker (обратите внимание, что после этого файл Docker.qcow2 сжимается)
  4. Перезапустите докер
  5. docker load -q -i <name>.tar

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

Ссылка: https://dbaontap.com/2017/07/18/clean-qcow2-docker-macbook/

Ответ 10

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