วิธีวิเคราะห์การใช้งานดิสก์ของคอนเทนเนอร์ Docker


258

ฉันเห็นว่า Docker ใช้ระบบไฟล์ของฉัน 12GB:

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

แต่ฉันจะรู้ได้อย่างไรว่ามันกระจายผ่านตู้คอนเทนเนอร์อย่างไร?

ฉันพยายามแนบกับคอนเทนเนอร์โดยเรียกใช้ (คำสั่ง v1.3 ใหม่)

docker exec -it <container_name> bash

จากนั้นเรียกใช้ 'df -h' เพื่อวิเคราะห์การใช้งานดิสก์ ดูเหมือนว่าจะใช้งานได้ แต่ไม่ใช่กับคอนเทนเนอร์ที่ใช้ 'volume-from'

ตัวอย่างเช่นฉันใช้ที่เก็บข้อมูลอย่างเดียวสำหรับ MongoDB เรียกว่า 'mongo-data'

เมื่อฉันเรียกใช้docker run -it --volumes-from mongo-data busyboxและจากนั้นdf -hภายในคอนเทนเนอร์มันบอกว่าระบบไฟล์ที่ติดตั้งอยู่บน/data/db(data-only container เท่านั้น 'mongo-data' ของฉัน) ใช้ 11.3G แต่เมื่อฉันทำdu -h /data/dbมันก็บอกว่าใช้เพียง 2.1G

ดังนั้นฉันจะวิเคราะห์การใช้ดิสก์คอนเทนเนอร์ / โวลุ่มได้อย่างไร หรือในกรณีของฉันฉันจะหาขนาดคอนเทนเนอร์ 'ข้อมูล Mongo' ได้อย่างไร


หากคุณต้องการลดขนาดของภาพหลายเลเยอร์ฉันสามารถแนะนำdocker-squashยูทิลิตี้ของ Jason Wilder รับได้จาก GitHub ที่นี่: github.com/jwilder/docker-squash
mhvelplund

ใน Mac OS X มีปัญหาแบบเปิด "Docker ไม่ปล่อยพื้นที่ดิสก์ ... ": github.com/docker/for-mac/issues/371
asmaier

คำตอบ:


460

หากต้องการดูขนาดไฟล์ของคอนเทนเนอร์ของคุณคุณสามารถใช้--sizeอาร์กิวเมนต์ของdocker ps:

docker ps --size

25
โปรดทราบว่านักเทียบท่า ps - ขนาดอาจใช้เวลาหลายนาทีจึงจะเสร็จสมบูรณ์และจะสร้าง IO หนักบนโฮสต์: github.com/axibase/axibase-collector-docs/blob/master/jobs/ …
Sergei Rodionov

5
ฉันสังเกตเห็นด้วยว่าการเรียกใช้docker ps -sไม่ได้เก็บบันทึกไว้ใน / var / lib / docker / เข้าสู่บัญชี
demee

17
มันส่งออกสองค่าเช่นนี้27.2MB (virtual 173MB)ความแตกต่างระหว่างพวกเขาคืออะไร?
Mohammed Noureldin

11
@MohammedNoureldin ต่อไปนี้เป็นคำอธิบาย: github.com/docker/docker.github.io/issues/…
aleclarson

4
โปรดทราบว่าสิ่งนี้ไม่ทำงานบน Docker สำหรับ Windows - เพียงแค่รายงาน 0 สำหรับทุกสิ่ง
Mike Christensen

303

หลังจาก1.13.0 นักเทียบท่าจะรวมคำสั่งใหม่docker system dfเพื่อแสดงการใช้ดิสก์นักเทียบท่า

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

วิธีแสดงข้อมูลโดยละเอียดเกี่ยวกับการใช้พื้นที่:

$ docker system df --verbose

คำสั่งที่มีประโยชน์อย่างหนึ่งถ้าคุณมีส่วนประกอบมากมาย:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq

คอลัมน์ SIZE ของภาชนะบรรจุหมายความว่าอย่างไร ฉันปิดคอนเทนเนอร์แล้วและคำสั่งนี้แสดง SIZE = 100MB เช่น
danilo

SIZE = 100MB สำหรับการปิดคอนเทนเนอร์
danilo

31

การโพสต์สิ่งนี้เป็นคำตอบเพราะความคิดเห็นของฉันถูกซ่อน:

รายการขนาดของภาชนะบรรจุ:

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

รายการขนาดของปริมาณของภาชนะบรรจุ:

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

แก้ไข: แสดงขนาดและปริมาณของคอนเทนเนอร์ที่กำลังทำงานทั้งหมด:

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

หมายเหตุ: เปลี่ยน 'devicemapper' ตามระบบไฟล์ Docker ของคุณ (เช่น 'aufs')


8
"du -d 2" ไม่ทำงานบนระบบ Centos ของฉันฉันต้องใช้ "du --max-depth 2" แทน
dr-jan

2
บน Mac /var/lib/docker/devicemapper: No such file or directoryมันแสดงให้เห็น มีความคิดที่จะเก็บ devicemapper บน mac ไหม?
Markus

Markus: หากคุณใช้ boot2docker คุณจะต้องรันduคำสั่งภายใน VM ของโฮสต์ boot2docker ของคุณ คำสั่งยังสามารถล้มเหลวได้หากคุณใช้aufsแทนอุปกรณ์ทำแผนที่
James

แล้ว 'docker ps -q' เพื่อแสดงรายการ hash ของ container แทนที่จะเป็น awk / tail?
Andrew Wolfe

ขนาดคอนเทนเนอร์ว่างเสมอในการติดตั้ง Ubuntu 14.04 / Docker 1.10.2
mhvelplund

22

ส่วนปริมาณไม่ทำงานอีกต่อไปดังนั้นหากใครมี insterested ฉันเพิ่งเปลี่ยนสคริปต์ข้างต้นเล็กน้อย:

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! = ปริมาณ
derFunk

Mac Docker 1.12.1 วางไฟล์รูปภาพใน ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs ชื่อไฟล์ที่ไม่มี. Id หรือ. Name :-(
paul_h

10

(คำตอบนี้ไม่มีประโยชน์ แต่ทิ้งไว้ที่นี่เนื่องจากความคิดเห็นบางส่วนอาจมี)

docker imagesจะแสดง 'ขนาดเสมือน' คือจำนวนผลรวมทั้งหมดรวมทั้งเลเยอร์ที่ต่ำกว่าทั้งหมด ดังนั้นการนับซ้ำหากคุณมีคอนเทนเนอร์ที่แชร์อิมเมจฐานเดียวกัน

เอกสาร


3
ฉันไม่ได้พูดถึงรูปภาพ แต่เกี่ยวกับคอนเทนเนอร์ (รายการที่แสดงโดยเรียกใช้ 'docker ps')
AlonL

1
ภาชนะบรรจุเป็นเหมือนกระบวนการ ไม่มีพื้นที่ดิสก์
ไบรอัน

2
"คำสั่งเรียกใช้นักเทียบท่าสร้างเลเยอร์คอนเทนเนอร์ที่เขียนได้เหนือรูปภาพที่ระบุ ... " ( docs.docker.com/v1.1/reference/commandline/cli ) เลเยอร์นั้นคือสิ่งที่ฉันหมายถึงหรือไดรฟ์ข้อมูลอื่น ๆ ที่เมาท์ ไปยังคอนเทนเนอร์ผ่าน 'ไดรฟ์จาก' ฯลฯ
AlonL

1
บางทีเครื่องมือนี้อาจช่วยได้? github.com/cpuguy83/docker-volumes อ้างอิงจากcontainer42.com/2014/11/03/docker-indepth-volumes
Bryan

1
ขอบคุณมันไม่ตอบสนองความต้องการของฉัน แต่เป็นเครื่องมือที่ดี
AlonL

10

ฉันเคยdocker stats $(docker ps --format={{.Names}}) --no-streamได้รับ:

  1. การใช้งาน CPU
  2. การใช้ Mem / Total mem ที่จัดสรรให้กับคอนเทนเนอร์ (สามารถจัดสรรได้ด้วยคำสั่ง docker run)
  3. จำนวน%
  4. บล็อก I / O
  5. Net I / O

8

คุณสามารถใช้ได้

docker history IMAGE_ID

เพื่อดูว่าขนาดภาพถูกกระจายระหว่างส่วนประกอบย่อยต่างๆอย่างไร


4

โปรดทราบว่าdocker ps --sizeอาจเป็นคำสั่งที่มีราคาแพงใช้เวลาดำเนินการมากกว่าสองสามนาที เช่นเดียวกับการร้องขอ API size=1รายการภาชนะที่มี มันดีกว่าที่จะไม่เรียกใช้บ่อยเกินไป

ดูทางเลือกที่เรารวบรวมรวมถึงdu -hsตัวเลือกสำหรับไดเรกทอรีปริมาณนักเทียบท่าถาวร


ไม่ใช่กรณีบนเซิร์ฟเวอร์ของฉัน - ทำงานเป็นมิลลิวินาที YMMV caveat ไปด้านบน (ทดสอบอย่างที่ Sergei พูดว่า "... อาจ ... ")
Todd Curry

ฉันกำลังทดสอบมันก็ยังเป็นที่ยอมรับโดยใช้นักเทียบท่า ps
andikurnia

3

ปรับปรุง anwser's Maxime:

docker ps --size

คุณจะเห็นสิ่งนี้:

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

เมื่อเริ่มต้นภาชนะภาพที่ภาชนะที่จะเริ่มต้นจากการติดตั้งอ่านอย่างเดียว(เสมือน)
ยิ่งไปกว่านั้นเลเยอร์ที่เขียนได้จะถูกเมาท์ซึ่งการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับคอนเทนเนอร์จะถูกเขียน

ดังนั้นขนาดเสมือน (183MB ในตัวอย่าง) จึงถูกใช้เพียงครั้งเดียวโดยไม่คำนึงว่าจะมีการเริ่มต้นคอนเทนเนอร์เท่าไหร่จากอิมเมจเดียวกันฉันสามารถเริ่ม 1 คอนเทนเนอร์หรือหนึ่งพัน ไม่มีพื้นที่ว่างในดิสก์พิเศษถูกนำมาใช้
"ขนาด" (2B ในตัวอย่าง) นั้นไม่ซ้ำกันสำหรับแต่ละคอนเทนเนอร์ดังนั้นพื้นที่ทั้งหมดที่ใช้บนดิสก์คือ:

183MB + 5B + 2B

โปรดระวังว่าขนาดที่แสดงไม่รวมถึงพื้นที่ดิสก์ทั้งหมดที่ใช้สำหรับคอนเทนเนอร์
สิ่งที่ไม่รวมอยู่ในปัจจุบันคือ;
- โวลุ่ม
- การสลับ
- จุดตรวจ
- พื้นที่ดิสก์ที่ใช้สำหรับล็อกไฟล์ที่สร้างโดยคอนเทนเนอร์

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.