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.