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

Sendiri
sumber
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
Maxime
sumber
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
Hemerson Varela
sumber
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')

Sendiri
sumber
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
Juanito
sumber
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

Bryan
sumber
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
Abhishek Jain
sumber
8

Kamu bisa memakai

docker history IMAGE_ID

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

eiTan LaVi
sumber
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.

Sergei Rodionov
sumber
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

danilo
sumber