Docker Machine: на устройстве не осталось места


126

Я пытаюсь настроить Docker Machine с помощью Docker Compose.

Сценарий 1 (без Docker Machine)
Если я работаю docker-compose up -dбез Docker Machine, он создает мои 3 связанных контейнера как задумано (nginx + mongodb + nodejs).

Сценарий 2 (с Docker Machine)
Затем я создаю виртуальную машину с помощью Docker Machine и приказываю Docker разговаривать с этой машиной eval $(docker-machine env streambacker-dev).

На этом этапе, если я подключу ssh к своей докер-машине и запускаю df -h, я получаю:

докер машина df -h

Если затем запустить docker-compose up -d, то при загрузке последнего контейнера я получаю сообщение об ошибке «На устройстве не осталось места» .

После этого "tmpfs" кажется действительно переполненным:

докер машина df -h

Проверка опции --virtualbox-disk-size показывает, что по умолчанию установлено значение 20000 МБ, что, как мне кажется, мы видим как «/ dev / sda1» на обоих изображениях. Так почему контейнеры заполняют «tmpfs» и что такое «tmpfs»? Это временный каталог для загрузки? Как я могу освободить место для моих контейнеров?

Спасибо!

Для информации я использую Docker Machine 0.4.0-rc2 и Docker Compose 1.3.2 .


4
Это не tmpfsимеет ничего общего с --virtualbox-disk-size. Это файловая система (например, RAM-диск), смонтированная в памяти, и ничто не имеет доступа к вашему диску.
0x7d7b

Спасибо @ h3nrik за эту информацию.
Марк Перрен-Пеллетье,

2
проверьте свисающие элементы докера, такие как висячие изображения, висячие тома, и удалите их. docker rmi $(docker images -f dangling=true -q)иdocker volume rm $(docker volume ls -f dangling=true -q)
Джинна Балу

Ответы:


87

Как сказано выше, это не tmpfsимеет отношения к --virtualbox-disk-size. Похоже, что boot2docker монтируется tmpfsв память, поэтому вам нужно выделить больше памяти для виртуальной машины virtualbox. Вы можете сделать это, указав --virtualbox-memoryпараметр.

   --virtualbox-memory "1024"
Size of memory for host in MB [$VIRTUALBOX_MEMORY_SIZE]

Значения по умолчанию:

$ docker-machine create --driver virtualbox testA
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
$ docker-machine ssh testA
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@testA:~$ df -h /
Filesystem                Size      Used Available Use% Mounted on
tmpfs                   896.6M    112.7M    783.9M  13% /

С --virtualbox-memoryустановленным на8096

$ docker-machine create --driver virtualbox --virtualbox-memory 8096 testB
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
$ docker-machine ssh testB
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@testB:~$ df -h /
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     6.9G    112.4M      6.8G   2% /

14
Не очень интуитивно понятно, но это сработало. Какого черта, Докер?
BastiBen,

1
Действительно, не интуитивно! Однако, похоже, это проблема, и я решил ее. Итак, +1.
Рэй Пендерграф

У меня тоже проблема исправлена, не понимаю как, но спасибо!
Bendihossan

Есть ли способ увеличить размер по умолчанию, чтобы мне не приходилось каждый раз указывать его вручную?
CGFoX

124

У меня была такая же ошибка ( [ERROR] InnoDB: Error number 28 means 'No space left on device'), и я решил ее так:

1. Удалить потерянные тома в Docker можно с помощью встроенной команды docker volume. Встроенная команда также удаляет любой каталог в / var / lib / docker / volume, который не является томом, поэтому убедитесь, что вы не поместили туда ничего, что хотите сохранить.

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

Очистка:

$ docker volume rm $(docker volume ls -qf dangling=true)

Дополнительные команды:

Список оборванных томов:

$ docker volume ls -qf dangling=true

Перечислить все тома:

$ docker volume ls

2. Также рассмотрите возможность удаления всех неиспользуемых изображений.

Сначала избавьтесь от <none>изображений (они иногда создаются при построении изображения, и если по какой-либо причине построение изображения было прервано, они остаются там).

вот хороший скрипт, который я использую для их удаления

docker rmi $(docker images | grep "^<none>" | awk '{print $3}')

Затем, если вы используете Docker Compose для локального создания изображений для каждого проекта. У вас будет много изображений, обычно называемых как ваша папка (например, если ваша папка проекта называется Hello, вы найдете имя изображения Hello_blablabla). так что также рассмотрите возможность удаления всех этих изображений

вы можете отредактировать приведенный выше сценарий, чтобы удалить их или удалить вручную с помощью

docker rmi {image-name}


3
На Mac я должен был использовать одиночные кавычки ( ') вокруг значений аргумента: docker rmi $(docker images | grep '^<none>' | awk '{print $3}'). Удаление остановленных контейнеров можно выполнить, docker rm $(docker ps -qa --no-trunc --filter "status=exited")как описано здесь: stackoverflow.com/a/32723127/619659 .
Webdevotion

1
У меня было так много неиспользуемых изображений, что я достиг предела символов моей оболочки. Вот почему я это сделал docker images | grep "^<none>" | xargs docker rmi.
Маттиас Браун,

1
Мне помогло удаление ненужных изображений.
akauppi

docker volume prune
justin.m.chase

.. см. мое пошаговое описание изменения размера / var / lib / docker с использованием resize2fs в другом потоке: stackoverflow.com/questions/32485723/…
Alex

66

Если вы используете Docker Community Edition:

 docker system prune
 docker volume prune  # as suggested by @justin-m-chase since system prune does not clean volumes.

Если вы используете boot2docker (docker-machine), очистите потерянные тома:

 docker volume rm $(docker volume ls -qf dangling=true)

Очистить неиспользуемые изображения:

 docker rmi $(docker images -q -f "dangling=true")

6
docker system pruneпомог мне
Максим Ефремов

2
docker system pruneftw
Майкл Гилд

1
docker volume pruneтолько для томов, системная обрезка не удалит «болтающиеся» тома.
justin.m.chase

Когда выше не ясно вам достаточно мест, вот ядерный вариант: docker rmi $(docker images -q). Добавьте, --forceесли необходимо, когда он пропускает группу слоев, включенных в несколько контейнеров.
EmptyArsenal

14

A. УДАЛИТЬ НЕИСПОЛЬЗУЕМЫЕ ИЗОБРАЖЕНИЯ

с помощью команд docker rm или docker rmi вы можете удалить ненужные изображения. На самом деле существует образ, который помогает в этой задаче (martin / docker-cleanup-volume). Основа - начать выбор из списка ваших изображений и контейнеров:

докер ps -a -s

Б. ИЗМЕНИТЬ ДИСКРИПТОР JSON ДОКЕРА

это упоминается на некоторых форумах. Идея состоит в том, чтобы увеличить дескриптор, расположенный в ~ / .docker / machine / machines / default / config.json. Параметр кажется DiskSize, но я не знаю, работает ли он в других ОС (не в Windows).

ИЗМЕНИТЬ РАЗМЕР LINUX:

в ОС Windows докер-машина или boot2docker на самом деле представляет собой виртуальную машину виртуального бокса, тогда вы можете выполнить процедуру, чтобы изменить размер диска. Позаботьтесь о резервном копировании файлов. Общая процедура состоит в том, чтобы изменить размер виртуального бокса, а затем использовать утилиту под названием gpartd для изменения пространства, воспринимаемого linux в своих разделах. Ниже приведены ссылки для выполнения этой процедуры:

D. СОЗДАТЬ ДОКЕР-МАШИНУ / BOOT2DOCKER

Идея состоит в том, чтобы воссоздать докер-машину по умолчанию. Следующие команды могут вас проиллюстрировать. Обратите внимание, что при повторном создании boot2docker вы потеряете предыдущие загруженные образы докеров.

docker-machine rm по умолчанию

docker-machine create --driver virtualbox --virtualbox-disk-size "100100" по умолчанию

докер-машина env по умолчанию

затем вы можете перейти в виртуальный ящик и увидеть пространство boot2docker с помощью команды "df -h"


Спасибо. Я работал в Windows. Я сделал это, воссоздав докер-машину.
KinoP

Помог D: (воссоздание докер-машины)
StanislavL

Спасибо, воссоздание докер-машины сработало для меня (я работаю в windows)
Луча Лаура Харди

Я чувствую такую ​​любовь!
eduyayo

2

В docker osx / я смог нажать кнопку [ Переместить образ диска ], и он успешно переместил Docker.qcow2 (предположительно содержащий контейнеры / изображения)

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


0

Я столкнулся с этой проблемой и не смог добавить дополнительное пространство с помощью пользовательского интерфейса докера для Mac, я установил докер с помощью homebrew и выполнил следующую команду при создании своей машины:

docker-machine create --driver virtualbox --virtualbox-memory "2048" --virtualbox-disk-size "40000" default

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.