Maszyna Docker: Brak miejsca na urządzeniu


126

Próbuję skonfigurować Docker Machine za pomocą Docker Compose.

Scenariusz 1 (bez Docker Machine)
Jeśli uruchomię docker-compose up -dbez Docker Machine, utworzy moje 3 połączone kontenery zgodnie z zamiarem (nginx + mongodb + nodejs).

Scenariusz 2 (z Docker Machine)
Następnie tworzę maszynę wirtualną za pomocą Docker Machine i mówię Dockerowi, aby rozmawiał z tą maszyną eval $(docker-machine env streambacker-dev).

W tym momencie, jeśli ssh do mojej maszyny dokującej i uruchomię df -h, otrzymuję:

maszyna dokująca df -h

Jeśli następnie uruchomię docker-compose up -d, podczas pobierania ostatniego kontenera pojawia się błąd „Brak miejsca na urządzeniu” .

„tmpfs” wydaje się być rzeczywiście trochę zapełniony po tym:

maszyna dokująca df -h

Zaznaczenie opcji --virtualbox-disk-size pokazuje, że domyślnie jest to 20000 MB, co, jak sądzę, widzimy jako „/ dev / sda1” na obu obrazach. Dlaczego więc kontenery zapełniają „tmpfs” n i czym dokładnie jest „tmpfs”? Czy jest to tymczasowy katalog pobierania? Jak mogę uzyskać więcej miejsca na moje kontenery?

Dzięki!

Aby uzyskać informacje, używam Docker Machine 0.4.0-rc2 i Docker Compose 1.3.2 .


4
Nie tmpfsma z tym nic wspólnego --virtualbox-disk-size. Jest to system plików (jak dysk RAM) zamontowany w pamięci i nic nie ma dostępu do twojego dysku.
0x7d7b

Dzięki @ h3nrik za te informacje.
Marc Perrin-Pelletier

2
sprawdź wiszące elementy dockera, takie jak wiszące obrazy, wiszące woluminy i usuń je. docker rmi $(docker images -f dangling=true -q)idocker volume rm $(docker volume ls -f dangling=true -q)
Jinna Balu

Odpowiedzi:


87

Jak wspomniano powyżej, tmpfsnie ma z tym nic wspólnego --virtualbox-disk-size. Wygląda na to, że boot2docker montuje się tmpfsw pamięci, więc musisz poświęcić więcej pamięci dla maszyny wirtualnej virtualbox. Możesz to zrobić, określając --virtualbox-memoryparametr.

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

Wartości domyślne:

$ 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% /

Z --virtualbox-memoryustawionym na8096

$ 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
Niezbyt intuicyjne, ale to zadziałało. Co do cholery, Docker?
BastiBen

1
Rzeczywiście nie jest to intuicyjne! Jednak wydaje się, że to jest problem z tym i naprawiłem go dla mnie. Więc +1.
Ray Pendergraph

Naprawiłem problem również dla mnie, nie rozumiem, jak, ale dziękuję!
Bendihossan

Jakikolwiek sposób na zwiększenie domyślnego rozmiaru, aby nie musieć za każdym razem określać go ręcznie?
CGFoX

124

Miałem ten sam błąd ( [ERROR] InnoDB: Error number 28 means 'No space left on device') i rozwiązałem go w ten sposób:

1. Usuń osierocone woluminy w Docker, możesz użyć wbudowanego polecenia woluminu docker. Wbudowane polecenie usuwa również każdy katalog w / var / lib / docker / volume, który nie jest woluminem, więc upewnij się, że nie umieściłeś tam niczego, co chcesz zapisać.

Ostrzeżenie: bądź bardzo ostrożny, jeśli masz jakieś dane, które chcesz zachować

Sprzątać:

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

Dodatkowe polecenia:

Lista wiszących woluminów:

$ docker volume ls -qf dangling=true

Wymień wszystkie tomy:

$ docker volume ls

2. Rozważ także usunięcie wszystkich nieużywanych obrazów.

Najpierw pozbądź się <none>obrazów (te są czasami generowane podczas budowania obrazu i jeśli z jakiegoś powodu budowanie obrazu zostało przerwane, pozostają tam).

oto ładny skrypt, którego używam do ich usuwania

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

Następnie, jeśli używasz Docker Compose do tworzenia obrazów lokalnie dla każdego projektu. Otrzymasz wiele obrazów, zwykle o nazwach takich jak twój folder (na przykład, jeśli folder projektu o nazwie Hello, znajdziesz nazwę obrazów Hello_blablabla). więc rozważ także usunięcie wszystkich tych obrazów

możesz edytować powyższy skrypt, aby je usunąć lub usunąć ręcznie za pomocą

docker rmi {image-name}


3
Na Mac musiałem użyć apostrofów ( ') wokół wartości argumentu docker rmi $(docker images | grep '^<none>' | awk '{print $3}'). Usunięcie zatrzymanych kontenerów można wykonać w docker rm $(docker ps -qa --no-trunc --filter "status=exited")sposób opisany tutaj: stackoverflow.com/a/32723127/619659 .
Webdevotion

1
Miałem tak wiele nieużywanych obrazów, że osiągnąłem limit znaków mojej powłoki. Dlatego to zrobiłem docker images | grep "^<none>" | xargs docker rmi.
Matthias Braun

1
Usunięcie niepotrzebnych obrazów pomogło mi.
akauppi

docker volume prune
justin.m.chase

.. zobacz mój opis krok po kroku dotyczący zmiany rozmiaru / var / lib / docker przy użyciu resize2fs w innym wątku: stackoverflow.com/questions/32485723/ ...
Alex

66

Jeśli używasz Docker Community Edition:

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

Jeśli używasz boot2docker (docker-machine), wyczyść woluminy, które są osierocone:

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

Wyczyść nieużywane obrazy:

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

6
docker system prunepomógł mi
Maxim Yefremov

2
docker system pruneftw
Michael Guild

1
docker volume prunetylko w przypadku woluminów przycinanie systemu nie usunie wiszących woluminów.
justin.m.chase

Gdy powyższe nie usunąć wystarczająco dużo miejsca, tutaj jest opcja jądrowa: docker rmi $(docker images -q). Dodaj, --forcejeśli musisz, gdy pomija kilka warstw zawartych w wielu kontenerach.
EmptyArsenal

14

A. USUŃ NIEUŻYWANE OBRAZY

Używając poleceń docker rm lub docker rmi, możesz usunąć obrazy, których nie potrzebujesz. Właściwie istnieje obraz, który pomaga w tym zadaniu (martin / docker-cleanup-volume). Podstawą jest rozpoczęcie selekcji z listy obrazów i kontenerów:

docker ps -a -s

B. ZMIENIĆ DESCRIPTOR JSON DOCKER

wspomina się o tym na niektórych forach. Chodzi o to, aby zwiększyć deskryptor znajdujący się w ~ / .docker / machine / machines / default / config.json. Wydaje się, że parametr to DiskSize, ale nie wiem, czy działa w innych systemach operacyjnych (nie w systemie Windows).

C. ZMIANA ROZMIARU LINUX:

w systemie operacyjnym Windows maszyna docker lub boot2docker jest w rzeczywistości maszyną wirtualną virtualbox, a następnie możesz postępować zgodnie z procedurą zmiany rozmiaru dysku. Uważaj, aby wykonać kopię zapasową plików. Ogólna procedura polega na zmianie rozmiaru w virtualbox, a następnie użyciu narzędzia o nazwie gpartd do modyfikowania przestrzeni postrzeganej przez Linuksa w jego partycjach. Poniżej znajdują się odnośniki do tej procedury:

D. ODTWÓRZ DOCKER-MACHINE / BOOT2DOCKER

Chodzi o to, aby odtworzyć domyślną maszynę dokującą. Poniższe polecenia mogą Cię zilustrować. Zwróć uwagę, że podczas ponownego tworzenia boot2dockera utracisz poprzednie pobrane obrazy dockera.

docker-machine rm default

docker-machine create --driver virtualbox --virtualbox-disk-size "100100" default

Docker-machine env default

następnie możesz przejść do wirtualnego pudełka i zobaczyć przestrzeń boot2docker za pomocą polecenia "df -h"


Dzięki. Pracowałem na Windowsie. Zrobiłem to, odtwarzając maszynę dokującą.
KinoP

Pomógł D: (odtwarzam maszynę dokera)
StanislavL

Dziękuję, odtworzenie maszyny dokującej zadziałało dla mnie (jestem w systemie Windows)
Lucha Laura Hardie

Czuję tak dużo miłości!
eduyayo

2

Na docker osx / mogłem nacisnąć przycisk [ Przenieś obraz dysku ] i pomyślnie przeniosłem Docker.qcow2 (prawdopodobnie zawierający kontenery / obrazy)

wprowadź opis obrazu tutaj początkowo - po uruchomieniu maszyn - nadal otrzymywałem komunikat o błędzie Brak miejsca na urządzeniu, ale wkrótce ustąpił.


0

Napotkałem ten problem i nie mogłem dodać dodatkowego miejsca za pomocą interfejsu Docker UI dla komputerów Mac, zainstalowałem docker z homebrew i uruchomiłem następujące polecenie podczas tworzenia mojego komputera:

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

to dodaje dwukrotnie więcej miejsca na pamięć i rozmiar dysku do wirtualnej skrzynki, którą miałem wcześniej i możesz dodać tutaj rozmiar ustawień, który potrzebujesz, według własnego uznania

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.