Cách phân tích việc sử dụng đĩa của Docker container


258

Tôi có thể thấy rằng Docker mất 12GB hệ thống tập tin của tôi:

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

Nhưng, làm thế nào để tôi biết làm thế nào điều này được phân phối trên các container?

Tôi đã cố gắn vào các thùng chứa bằng cách chạy (lệnh v1.3 mới)

docker exec -it <container_name> bash

và sau đó chạy 'df -h' để phân tích việc sử dụng đĩa. Nó dường như đang hoạt động, nhưng không phải với các container sử dụng 'volume-from'.

Ví dụ: tôi sử dụng bộ chứa chỉ dữ liệu cho MongoDB, được gọi là 'mongo-data'.

Khi tôi chạy docker run -it --volumes-from mongo-data busybox, và sau đó df -hbên trong container, Nó nói rằng hệ thống tập tin được gắn trên /data/db(bộ chứa chỉ dữ liệu 'mongo-data' của tôi) sử dụng 11.3G, nhưng khi tôi làm du -h /data/db, nó nói rằng nó chỉ sử dụng 2.1G.

Vì vậy, làm thế nào để tôi phân tích việc sử dụng đĩa chứa / ổ đĩa? Hoặc, trong trường hợp của tôi, làm cách nào để tìm ra kích thước vùng chứa 'dữ liệu mongo'?


Nếu bạn muốn giảm kích thước của nhiều hình ảnh, tôi có thể đề xuất docker-squashtiện ích của Jason Wilder's . Nhận nó từ GitHub tại đây: github.com/jwilder/docker-squash
mhvelplund

Trên Mac OS X có một vấn đề mở "Docker không giải phóng dung lượng ổ đĩa ...": github.com/docker/for-mac/issues/371
asmaier

Câu trả lời:


460

Để xem kích thước tệp của các thùng chứa của bạn, bạn có thể sử dụng --sizeđối số docker ps:

docker ps --size

25
Lưu ý rằng docker ps --size có thể mất vài phút để hoàn thành và sẽ tạo ra IO nặng trên máy chủ: github.com/axibase/axibase-collector-docs/blob/master/jobs/iêu
Sergei Rodionov

5
Tôi cũng nhận thấy rằng việc chạy docker ps -skhông đưa các bản ghi được lưu bên trong / var / lib / docker / vào tài khoản.
demee

17
Nó xuất ra hai giá trị, như thế này có 27.2MB (virtual 173MB)gì khác biệt giữa chúng?
Mohammed Noureldin

11
@MohammedNoureldin Đây là một lời giải thích: github.com/docker/docker.github.io/issues/
Kẻ

4
Lưu ý điều này không hoạt động trên Docker cho Windows - nó chỉ báo cáo 0 cho mọi thứ.
Mike Christensen

303

Sau 1.13.0, Docker bao gồm một lệnh mới docker system dfđể hiển thị việc sử dụng đĩa 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%)

Để hiển thị thông tin chi tiết hơn về việc sử dụng không gian:

$ docker system df --verbose

Một lệnh hữu ích nếu bạn có nhiều thành phần:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq 18/07/19

Cột SIZE của container có nghĩa là gì? Tôi có một số container bị tắt và lệnh này hiển thị SIZE = 100MB chẳng hạn.
danilo

SIZE = 100MB cho container bị tắt
danilo

31

Đăng bài này như một câu trả lời vì ý kiến ​​của tôi ở trên đã bị ẩn:

Liệt kê kích thước của một container:

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

Liệt kê kích thước của khối lượng chứa:

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

Chỉnh sửa: Liệt kê tất cả kích thước và khối lượng của container đang chạy:

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

LƯU Ý: Thay đổi 'devicemapper' theo hệ thống tệp Docker của bạn (ví dụ: 'aufs')


8
"du -d 2" không hoạt động trên hệ thống Centos của tôi, thay vào đó tôi phải sử dụng "du --max-sâu 2".
dr-jan

2
Trên Mac nó hiển thị /var/lib/docker/devicemapper: No such file or directory. Bất kỳ ý tưởng nơi devicemapper được lưu trữ trên mac?
Markus

Markus: nếu bạn đang sử dụng boot2docker, bạn phải chạy dulệnh bên trong VM máy chủ boot2docker của bạn. Lệnh cũng có thể thất bại nếu bạn đang sử dụng aufsthay cho trình ánh xạ thiết bị.
James

Làm thế nào về 'docker ps -q' để liệt kê các giá trị băm của các container thay vì awk / tail?
Andrew Wolfe

Kích thước vùng chứa luôn trống trong cài đặt Ubuntu 14.04 / Docker 1.10.2 của tôi.
mhvelplund

22

Phần âm lượng không hoạt động nữa nên nếu có ai bị hỏng, tôi chỉ cần thay đổi đoạn script trên một chút:

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! = Tập
derFunk

Mac Docker 1.12.1 đặt các tệp hình ảnh vào ~ / Library / Container / com.docker.docker / not / var / lib / docker / aufs. Tên tệp không chứa .Id hoặc .Name :-(
paul_h

10

(câu trả lời này không hữu ích, nhưng hãy để nó ở đây vì một số ý kiến ​​có thể)

docker imagessẽ hiển thị 'kích thước ảo', tức là tổng cộng bao gồm tất cả các lớp thấp hơn. Vì vậy, một số tính hai lần nếu bạn có các thùng chứa chia sẻ cùng một hình ảnh cơ sở.

tài liệu


3
Tôi không nói về hình ảnh, mà là về các thùng chứa (Danh sách được hiển thị bằng cách chạy 'docker ps').
AlonL

1
Container giống như các quy trình; họ không có không gian đĩa.
Bryan

2
"Lệnh docker run trước tiên tạo lớp chứa có thể ghi trên hình ảnh được chỉ định ..." ( docs.docker.com/v1.1/reference/commandline/cli ) Lớp đó là ý tôi, hoặc bất kỳ khối lượng nào khác được gắn đến container thông qua 'volume-from', v.v.
AlonL


1
Cảm ơn, nó không đáp ứng nhu cầu của tôi nhưng nó là một công cụ tốt.
AlonL

10

Tôi sử dụng docker stats $(docker ps --format={{.Names}}) --no-streamđể có được:

  1. Sử dụng CPU,
  2. Sử dụng Mem / Tổng số mem được phân bổ cho vùng chứa (có thể được phân bổ bằng lệnh chạy docker)
  3. Mem%
  4. Khối I / O
  5. I / O ròng

8

Bạn có thể dùng

docker history IMAGE_ID

để xem kích thước hình ảnh được phân bổ giữa các thành phần phụ khác nhau của nó.


4

Hãy nhớ rằng đó docker ps --sizecó thể là một lệnh đắt tiền, mất hơn một vài phút để hoàn thành. Điều tương tự cũng áp dụng cho các yêu cầu API của danh sách container vớisize=1 . Tốt hơn hết là đừng chạy nó quá thường xuyên.

Hãy xem các lựa chọn thay thế mà chúng tôi biên soạn, bao gồm du -hstùy chọn cho thư mục âm lượng liên tục docker.


Không phải trường hợp trên máy chủ của tôi - chạy trong một phần nghìn giây. YMMV báo trước những điều trên (kiểm tra, như Sergei nói "... có thể ...")
Todd Curry

Tôi cũng đang thử nghiệm, vẫn có thể chấp nhận được khi sử dụng
docker

3

Cải thiện anwser của Maxime:

docker ps --size

Bạn sẽ thấy một cái gì đó như thế này:

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

Khi bắt đầu một container, hình ảnh mà container được bắt đầu được gắn ở chế độ chỉ đọc (ảo) .
Trên hết, một lớp có thể ghi được gắn kết, trong đó bất kỳ thay đổi nào được thực hiện đối với vùng chứa đều được ghi.

Vì vậy, kích thước ảo (ví dụ 183 MB) chỉ được sử dụng một lần, bất kể có bao nhiêu container được bắt đầu từ cùng một hình ảnh - tôi có thể bắt đầu 1 container hoặc một nghìn; không có không gian đĩa thêm được sử dụng .
"Kích thước" (ví dụ 2B) là duy nhất cho mỗi vùng chứa, do đó, tổng dung lượng được sử dụng trên đĩa là:

183 MB + 5B + 2B

Xin lưu ý rằng kích thước hiển thị không bao gồm tất cả không gian đĩa được sử dụng cho một thùng chứa.
Những thứ không được bao gồm hiện nay là;
- khối lượng
- trao đổi
- điểm kiểm tra
- không gian đĩa được sử dụng cho các tệp nhật ký được tạo bởi container

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.