Bagaimana menganalisis penggunaan disk wadah Docker


258

Saya dapat melihat bahwa Docker membutuhkan 12GB sistem file saya:

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

Tapi, bagaimana saya tahu bagaimana ini didistribusikan di atas wadah?

Saya mencoba melampirkan ke wadah dengan menjalankan (perintah v1.3 baru)

docker exec -it <container_name> bash

dan kemudian jalankan 'df -h' untuk menganalisis penggunaan disk. Tampaknya berfungsi, tetapi tidak dengan wadah yang menggunakan 'volume-dari'.

Misalnya, saya menggunakan wadah data saja untuk MongoDB, yang disebut 'mongo-data'.

Ketika saya menjalankan docker run -it --volumes-from mongo-data busybox, dan kemudian df -hdi dalam kontainer, Dikatakan bahwa filesystem yang dipasang pada /data/db(hanya data mongo-data 'saya) menggunakan 11.3G, tetapi ketika saya melakukannya du -h /data/db, ia mengatakan bahwa ia hanya menggunakan 2.1G.

Jadi, bagaimana cara menganalisis penggunaan disk wadah / volume? Atau, dalam kasus saya, bagaimana cara mengetahui ukuran kontainer 'mongo-data'?


Jika Anda ingin mengurangi ukuran gambar berlapis-banyak, saya dapat merekomendasikan docker-squashutilitas Jason Wilder . Dapatkan dari GitHub di sini: github.com/jwilder/docker-squash
mhvelplund

Di Mac OS X ada masalah terbuka "Docker tidak merilis ruang disk ...": github.com/docker/for-mac/issues/371
asmaier

Jawaban:


461

Untuk melihat ukuran file wadah Anda, Anda dapat menggunakan --sizeargumen docker ps:

docker ps --size

25
Perhatikan bahwa buruh pelabuhan ps --ukuran dapat memakan waktu beberapa menit untuk menyelesaikan dan akan menghasilkan IO berat di host: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Sergei Rodionov

5
Saya perhatikan juga bahwa menjalankan docker ps -stidak memperhitungkan log yang tersimpan di dalam / var / lib / docker /.
demee

17
Ini menghasilkan dua nilai, seperti ini 27.2MB (virtual 173MB)apa perbedaan di antara mereka?
Mohammed Noureldin

11
@MohammedNoureldin Berikut penjelasannya: github.com/docker/docker.github.io/issues/…
aleclarson

4
Catatan ini tidak berfungsi pada Docker untuk Windows - hanya melaporkan 0 untuk semuanya.
Mike Christensen

303

Setelah 1.13.0, Docker menyertakan perintah baru docker system dfuntuk menunjukkan penggunaan disk docker.

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

Untuk menampilkan informasi lebih rinci tentang penggunaan ruang:

$ docker system df --verbose

Satu perintah yang berguna jika Anda memiliki banyak komponen:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq

apa arti kolom SIZE dari penampung? Saya memiliki beberapa wadah, dan perintah ini menunjukkan SIZE = 100MB misalnya.
danilo

SIZE = 100MB untuk wadah
danilo

31

Posting ini sebagai jawaban karena komentar saya di atas disembunyikan:

Daftar ukuran wadah:

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

Daftar ukuran volume wadah:

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

Sunting: Sebutkan semua ukuran dan volume kontainer yang sedang berjalan:

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

CATATAN: Ubah 'devicemapper' sesuai dengan sistem file Docker Anda (mis. 'Aufs')


8
"du -d 2" tidak berfungsi pada sistem Centos saya, saya harus menggunakan "du --max-depth 2" sebagai gantinya.
dr-januari

2
Di Mac itu terlihat /var/lib/docker/devicemapper: No such file or directory. Tahu di mana devicemapper disimpan di mac?
Markus

Markus: jika Anda menggunakan boot2docker, Anda harus menjalankan duperintah di dalam host boot2docker Anda, VM. Perintah ini juga bisa gagal jika Anda menggunakan aufsalih-alih perangkat mapper.
James

bagaimana dengan 'buruh pelabuhan ps -q' untuk daftar hash wadah bukan awk / tail?
Andrew Wolfe

Ukuran kontainer selalu kosong pada instalasi Ubuntu 14.04 / Docker 1.10.2 saya.
mhvelplund

22

Bagian volume tidak berfungsi lagi jadi jika ada yang diinput saya hanya mengubah sedikit script di atas:

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

Mount Points! = Volume
derFunk

Mac Docker 1.12.1 menempatkan file gambar di ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Nama file yang tidak mengandung .Id atau .Name :-(
paul_h

10

(jawaban ini tidak berguna, tetapi meninggalkannya di sini karena beberapa komentar mungkin)

docker imagesakan menampilkan 'ukuran virtual', yaitu berapa total termasuk semua lapisan bawah. Jadi beberapa penghitungan ganda jika Anda memiliki wadah yang berbagi gambar dasar yang sama.

dokumentasi


3
Saya tidak berbicara tentang gambar, tetapi tentang wadah (Daftar ditampilkan dengan menjalankan 'buruh pelabuhan ps').
Sendiri

1
Wadah seperti proses; mereka tidak memiliki ruang disk.
Bryan

2
"Perintah run docker pertama-tama menciptakan lapisan kontainer yang dapat ditulisi di atas gambar yang ditentukan ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Lapisan itu yang saya maksudkan, atau volume lain apa pun yang dipasang ke wadah melalui 'volume-dari', dll.
AlonL


1
Terima kasih, itu tidak memenuhi kebutuhan saya tetapi ini adalah alat yang bagus.
AlonL

10

Saya gunakan docker stats $(docker ps --format={{.Names}}) --no-streamuntuk mendapatkan:

  1. Penggunaan CPU,
  2. Mem penggunaan / Total mem dialokasikan untuk wadah (dapat dialokasikan dengan perintah run docker)
  3. Mem%
  4. Blok I / O
  5. I / O Bersih

8

Kamu bisa memakai

docker history IMAGE_ID

untuk melihat bagaimana ukuran gambar dibagi antara berbagai sub-komponennya.


4

Ingatlah bahwa itu docker ps --sizemungkin perintah yang mahal, membutuhkan lebih dari beberapa menit untuk menyelesaikannya. Hal yang sama berlaku untuk permintaan API daftar kontainer dengan size=1. Lebih baik tidak menjalankannya terlalu sering.

Lihatlah alternatif yang kami kompilasi, termasuk du -hsopsi untuk direktori volume persisten buruh pelabuhan.


Bukan kasus di server saya - berjalan dalam milidetik. YMMV peringatan ke atas (tes, seperti kata Sergei "... mungkin ...")
Todd Curry

Saya juga menguji, masih dapat diterima menggunakan buruh pelabuhan ps
ukuran

3

Meningkatkan Maxime's anwser:

docker ps --size

Anda akan melihat sesuatu seperti ini:

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

Saat memulai sebuah wadah, gambar dari mana wadah itu dimulai dipasang hanya-baca (virtual) .
Selain itu, layer yang dapat ditulis sudah terpasang, di mana setiap perubahan yang dibuat pada wadah ditulis.

Jadi ukuran Virtual (183MB dalam contoh) hanya digunakan satu kali, terlepas dari berapa banyak wadah yang dimulai dari gambar yang sama - saya dapat mulai 1 kontainer atau seribu; tidak ada ruang disk tambahan yang digunakan .
"Ukuran" (2B dalam contoh) adalah unik per wadah, jadi total ruang yang digunakan pada disk adalah:

183MB + 5B + 2B

Perlu diketahui bahwa ukuran yang ditampilkan tidak termasuk semua ruang disk yang digunakan untuk wadah.
Hal-hal yang tidak termasuk saat ini adalah;
- volume
- swapping
- pos pemeriksaan
- ruang disk yang digunakan untuk file-file log yang dihasilkan oleh kontainer

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.