Jak analizować użycie dysku przez kontener Docker


258

Widzę, że Docker zajmuje 12 GB mojego systemu plików:

2.7G    /var/lib/docker/vfs/dir
2.7G    /var/lib/docker/vfs
2.8G    /var/lib/docker/devicemapper/mnt
6.3G    /var/lib/docker/devicemapper/devicemapper
9.1G    /var/lib/docker/devicemapper
12G     /var/lib/docker

Ale skąd mam wiedzieć, jak to jest rozłożone na pojemniki?

Próbowałem dołączyć do kontenerów, uruchamiając (nowa komenda v1.3)

docker exec -it <container_name> bash

a następnie uruchom „df -h”, aby przeanalizować użycie dysku. Wygląda na to, że działa, ale nie z kontenerami używającymi „woluminów z”.

Na przykład używam kontenera tylko danych dla MongoDB, zwanego „danymi mongo”.

Kiedy uruchamiam docker run -it --volumes-from mongo-data busybox, a następnie df -hw kontenerze, mówi, że system plików zamontowany na /data/db(mój kontener tylko danych „mongo-data”) używa 11,3G, ale kiedy to robię du -h /data/db, mówi, że używa tylko 2,1G.

Jak więc przeanalizować użycie kontenera / woluminu? Lub, w moim przypadku, jak znaleźć rozmiar kontenera „mongo-data”?


Jeśli chcesz zmniejszyć rozmiar wielowarstwowych obrazów, mogę polecić docker-squashnarzędzie Jasona Wildera . Pobierz go z GitHub tutaj: github.com/jwilder/docker-squash
mhvelplund

W systemie Mac OS X istnieje otwarty problem „Docker nie zwalnia miejsca na dysku ...”: github.com/docker/for-mac/issues/371
asmaier

Odpowiedzi:


460

Aby zobaczyć rozmiar pliku swoich kontenerów, możesz użyć --sizeargumentu docker ps:

docker ps --size

25
Pamiętaj, że dokowanie ps --size może potrwać kilka minut i spowoduje ciężkie we / wy na hoście: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Siergiej Rodionow

5
Zauważyłem również, że uruchamianie docker ps -snie bierze pod uwagę dzienników przechowywanych w / var / lib / docker /.
demee

17
Wyprowadza dwie wartości, na przykład, 27.2MB (virtual 173MB)jaka jest między nimi różnica?
Mohammed Noureldin

11
@MohammedNoureldin Oto wyjaśnienie: github.com/docker/docker.github.io/issues/…
aleclarson

4
Uwaga: to nie działa w Docker dla Windows - po prostu zgłasza 0 za wszystko.
Mike Christensen

303

Po wersji 1.13.0 Docker zawiera nowe polecenie docker system dfpokazujące użycie dysku dokującego .

$ docker system df
TYPE            TOTAL        ACTIVE     SIZE        RECLAIMABLE
Images          5            1          2.777 GB    2.647 GB (95%)
Containers      1            1          0 B         0B
Local Volumes   4            1          3.207 GB    2.261 (70%)

Aby wyświetlić bardziej szczegółowe informacje na temat wykorzystania miejsca:

$ docker system df --verbose

Jedno przydatne polecenie, jeśli masz wiele składników:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq

co oznacza kolumna SIZE kontenera? Mam wyłączone niektóre pojemniki, a to polecenie pokazuje na przykład ROZMIAR = 100 MB.
danilo

SIZE = 100 MB na wyłączony pojemnik
danilo

31

Opublikowałem to jako odpowiedź, ponieważ moje powyższe komentarze zostały ukryte:

Podaj rozmiar pojemnika:

du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>`

Wymień rozmiary woluminów kontenera:

docker inspect -f "{{.Volumes}}" <container_name> | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h

Edycja: Wyświetl listę wszystkich działających rozmiarów i objętości kontenerów:

for d in `docker ps -q`; do
    d_name=`docker inspect -f {{.Name}} $d`
    echo "========================================================="
    echo "$d_name ($d) container size:"
    sudo du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" $d`
    echo "$d_name ($d) volumes:"
    docker inspect -f "{{.Volumes}}" $d | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h
done

UWAGA: Zmień „devicemapper” zgodnie z systemem plików Docker (np. „Aufs”)


8
„du -d 2” nie działa na moim systemie Centos, musiałem zamiast tego użyć „du --max-depth 2”.
dr-sty

2
Na Macu to pokazuje /var/lib/docker/devicemapper: No such file or directory. Masz pomysł, gdzie devicemapper jest przechowywany na komputerze Mac?
Markus

Markus: jeśli używasz boot2docker, musisz uruchomić dupolecenie wewnątrz maszyny wirtualnej hosta boot2docker. Polecenie może również zakończyć się niepowodzeniem, jeśli używasz aufszamiast mapera urządzeń.
James

co powiesz na „docker ps -q”, aby wyświetlić skróty kontenerów zamiast awk / tail?
Andrew Wolfe,

Rozmiar kontenera jest zawsze pusty w mojej instalacji Ubuntu 14.04 / Docker 1.10.2.
mhvelplund

22

Część głośności już nie działała, więc jeśli ktoś jest tym zainteresowany, po prostu zmieniam nieco powyższy skrypt:

for d in `docker ps | awk '{print $1}' | tail -n +2`; do
    d_name=`docker inspect -f {{.Name}} $d`
    echo "========================================================="
    echo "$d_name ($d) container size:"
    sudo du -d 2 -h /var/lib/docker/aufs | grep `docker inspect -f "{{.Id}}" $d`
    echo "$d_name ($d) volumes:"
    for mount in `docker inspect -f "{{range .Mounts}} {{.Source}}:{{.Destination}}                                                                                                                                                      
    {{end}}" $d`; do
        size=`echo $mount | cut -d':' -f1 | sudo xargs du -d 0 -h`
        mnt=`echo $mount | cut -d':' -f2`
        echo "$size mounted on $mnt"
    done
done

Punkty montowania! = Woluminy
derFunk

Mac Docker 1.12.1 umieszcza pliki obrazów w ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Nazwy plików, dla których nie zawierają .Id lub .Name :-(
paul_h

10

(ta odpowiedź nie jest przydatna, ale zostawia ją tutaj, ponieważ niektóre komentarze mogą być)

docker imagespokaże „rozmiar wirtualny”, tj. ile łącznie obejmują wszystkie niższe warstwy. Więc podwójne liczenie, jeśli masz pojemniki, które mają ten sam obraz podstawowy.

dokumentacja


3
Nie mówię o obrazach, ale o kontenerach (lista pokazana po uruchomieniu „docker ps”).
AlonL,

1
Pojemniki są jak procesy; nie mają miejsca na dysku.
Bryan,

2
„Komenda uruchamiania dokera najpierw tworzy zapisywalną warstwę kontenera na określonym obrazie ...” ( docs.docker.com/v1.1/reference/commandline/cli ) Ta warstwa jest tym, co mam na myśli, lub innymi woluminami, które są zamontowane do kontenera za pośrednictwem „tomów z” itp.
AlonL,


1
Dzięki, nie zaspokaja moich potrzeb, ale to miłe narzędzie.
AlonL,

10

Używam, docker stats $(docker ps --format={{.Names}}) --no-streamaby uzyskać:

  1. Użycie procesora,
  2. Wykorzystanie pamięci / Całkowita pamięć przydzielona do kontenera (może być przydzielona za pomocą polecenia uruchamiania dokera)
  3. Mem%
  4. Zablokuj we / wy
  5. Net I / O

8

Możesz użyć

docker history IMAGE_ID

aby zobaczyć, w jaki sposób rozmiar obrazu jest dzielony między jego różne podskładniki.


4

Pamiętaj, że docker ps --sizewykonanie polecenia może być kosztowne i może potrwać dłużej niż kilka minut. To samo dotyczy żądań API list kontenerów z size=1. Lepiej nie uruchamiać go zbyt często.

Spójrz na skompilowane przez nas alternatywy , w tym du -hsopcję katalogu stałego woluminu dokera.


Nie na moim serwerze - działa w milisekundach. Zastrzeżenie YMMV do powyższego (test, jak Siergiej mówi „... może ...”)
Todd Curry

Testuję również, wciąż jest to dopuszczalne przy użyciu dokera ps --size
andikurnia

3

Poprawianie odpowiedzi Maxime'a:

docker ps --size

Zobaczysz coś takiego:

+---------------+---------------+--------------------+
| CONTAINER ID  | IMAGE         | SIZE               |
+===============+===============+====================+
| 6ca0cef8db8d  | nginx         | 2B (virtual 183MB) |
| 3ab1a4d8dc5a  | nginx         | 5B (virtual 183MB) |
+---------------+---------------+--------------------+

Podczas uruchamiania kontenera obraz, z którego kontener jest uruchamiany, jest montowany tylko do odczytu (wirtualny) .
Ponadto zamontowana jest warstwa do zapisu, w której zapisywane są wszelkie zmiany dokonane w kontenerze.

Więc Wirtualna Wielkość (183MB w przykładzie) jest używany tylko raz, niezależnie od tego, ile pojemniki są uruchamiane z tego samego obrazu - Mogę zacząć 1 opakowanie lub tysiąc; nie jest używane dodatkowe miejsce na dysku .
„Rozmiar” (w tym przykładzie 2B) jest unikalny dla każdego kontenera, więc łączne miejsce na dysku wynosi:

183 MB + 5B + 2B

Pamiętaj, że pokazany rozmiar nie obejmuje całego miejsca na dysku używanego dla kontenera.
Rzeczy, które nie są obecnie uwzględnione, to;
- woluminy
- zamiana
- punkty kontrolne
- miejsce na dysku wykorzystywane na pliki dziennika generowane przez kontener

https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362

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.