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”?

AlonL
źródło
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
Maxime
źródło
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
Hemerson Varela
źródło
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”)

AlonL
źródło
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
Juanito
źródło
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

Bryan
źródło
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
Może to narzędzie pomoże? github.com/cpuguy83/docker-volumes Referenced from container42.com/2014/11/03/docker-indepth-volumes
Bryan
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
Abhishek Jain
źródł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.

eiTan LaVi
źródło
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.

Siergiej Rodionow
źródło
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

Danilo
źródło