Do napisania tego wpisu skłonił mnie artykuł na medium o problemie braku miejsca…

Przypomniałem sobie, jak parę lat temu (jako początkujący programista) zostałem kolejny raz wrzucony na głęboką wodę i dołączyłem do projektu, gdzie był używany Docker. Było to mniej więcej w roku 2015 (małe przypomnienie: Docker powstał 20 marca 2013). Mało było informacji o tej technologii. No ale cóż zrobić – trzeba się nauczyć (bo pracować trzeba). Moje początki wyglądały mniej więcej tak: uruchamiam ulubioną wyszukiwarkę -> hasło 'Docker’ -> pierwszy artykuł -> instalacja -> pierwsze komendy: „docker run ...„, „docker build ...„. Próbuje coś z tego zrozumieć. I co? Brak miejsca na dysku. Ale jak to? Przecież jeszcze parę godzin temu miałem 10 GB. Zaczynam szukać, gdzie jest problem. Mam Cię ty Dockerze! Tylko co teraz?

Docker system

Docker udostępnia nam kilka poleceń, które umożliwiają szybkie zorientowanie się, w jakich warunkach pracujemy. Wszystkie one znajdują się pod poleceniem „docker system„. Zdecydowanie warto sprawdzić polecenie „docker system info„. Pokaże nam ono wszystkie informacje o systemie, w którym działamy. Jednak, gdy borykamy się z brakiem miejsca, warto sprawdzić polecenie:

docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          77        2         12.09GB   12.09GB (99%)
Containers      2         2         43.99kB   0B (0%)
Local Volumes   96        1         6.789GB   6.714GB (98%)
Build Cache     0         0         0B        0B

Jak widać, pokaże nam ono, ile miejsca na dysku zajmują poszczególne elementy. Kolejne komponenty to:

  • images – obrazy Dockera pobrane z repozytorium zdalnego oraz te zbudowane lokalnie,
  • containers – kontenery uruchomione w systemie,
  • local volumes – trwałe lokalne magazyny danych zapisane na komputerze hoście poza systemem plików kontenera,
  • build cache – cache wygenerowany w trakcie budowania obrazów.

Poszczególne kolumny powinny być jasne, oprócz ostatniej. Oznacza ona ilość miejsca, które może zostać odzyskane, ponieważ nie jest w tym momencie używane przez działające kontenery. Wszystko to, co jest tutaj wypisane, standardowo jest zapisane na dysku hosta w katalogu „/var/lib/docker„.

Jak widać, z mojego systemu w razie potrzeby mogłoby zniknąć około 18 GB danych. Oczywiście w razie nagłej potrzeby można zatrzymać oraz usunąć wszystkie kontenery poleceniem: "docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)", a następnie poleceniem "docker rmi $(docker images -q)" usunąć wszystkie obrazy z systemu. Te dwa polecenia powinny zostawić nam system w trochę lepszym stanie, ale najprawdopodobniej przyjdzie nam budować lub pobierać jeszcze raz te same obrazy. Jest to jakieś rozwiązanie, ale ja polecam użyć:

docker system prune

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Polecenie to usunie wszystkie:

  • zatrzymane kontenery (zrobi to samo co „docker rm -f $(docker ps -a -q)„),
  • sieci, które nie są używane przez żaden kontener,
  • odłączone obrazy, czyli takie, które nie są powiązane z żadnym otagowanym obrazem (pamiętaj, że obrazy mają warstwy, jak ogry czy cebula),
  • odłączony cache, czyli cache, który nie jest powiązany z żadnym buildem.

Sprawdźmy, co się stanie, jeżeli wykonam to polecenie na moim systemie:

docker system prune 

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
...

Deleted Networks:
...

Deleted Images:
...

Total reclaimed space: 2.869GB

2.86 GB? Całkiem nieźle biorąc pod uwagę, że nic nie straciłem, jedynie usunąłem nieużywane rzeczy.

Co dalej? Wpisz "docker images", aby zobaczyć wszystkie Twoje obrazy. Nie wiem jak Ty, ale ja często buduje/pobieram obrazy, żeby coś przetestować, a później już ich nigdy nie używam. Przed wyczyszczeniem moja lista zawierała 49 pozycji. Sprawdź, które Ci się więcej nie przydadzą i wpisz: "docker rmi image_name:tag". Operacja jest bardzo monotonna, ale u mnie po paru minutach zostało 16 obrazów, których regularnie używam. Stan mojego systemu wygląda teraz tak:

docker system df  

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          16        2         2.268GB   1.984GB (87%)
Containers      2         2         9.238MB   0B (0%)
Local Volumes   97        1         6.865GB   6.789GB (98%)
Build Cache     0         0         0B        0B

Została ostatnia część: wolumeny. Aby je wyczyścić, zatrzymałem i usunąłem wszystkie działające kontenery oraz wykonałem ostatnie już polecenie:

docker volume prune

WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y

Usuwa ono wszystkie lokalne wolumeny, które nie są używane przez żaden kontener. Po wszystkich tych operacjach w naszym systemie zostaje tylko to, co jest nam potrzebne do codziennej pracy. Mam nadzieję, że teraz już wiesz co zrobić, gdy zaczyna brakować miejsca na dysku. Daj znać w komentarzu, ile miejsca udało Ci się zaoszczędzić.


0 komentarzy

Dodaj komentarz

Avatar placeholder

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *