Як проаналізувати використання диска контейнера Docker


258

Я бачу, що Docker бере 12 ГБ моєї файлової системи:

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' для аналізу використання диска. Здається, це працює, але не з контейнерами, які використовують "обсяги-з".

Наприклад, я використовую контейнер лише для даних MongoDB, який називається "mongo-data".

Коли я запускаю docker run -it --volumes-from mongo-data busybox, а потім df -hвсередині контейнера, він говорить, що файлова система, встановлена ​​на /data/dbмоєму контейнері "монго-дані", використовує 11.3G, але коли я це робити du -h /data/db, він говорить, що він використовує лише 2.1G.

Отже, як я аналізую використання контейнера / обсягу диска? Або, в моєму випадку, як дізнатися розмір контейнера "монго-дані"?


Якщо ви хочете зменшити розмір багатошарових зображень, я можу порекомендувати docker-squashутиліту Джейсона Уайлдера . Отримати його від 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
Зауважте, що docker ps --size може зайняти кілька хвилин, і він створить важкий IO на хості: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Сергій Родіонов

5
Я також зауважив, що біг docker ps -sне враховує журнали, що зберігаються всередині / var / lib / docker /.
деме

17
Він виводить два значення, наприклад, у 27.2MB (virtual 173MB)чому різниця між ними?
Мохаммед Нурелдін

11
@MohammedNoureldin Ось пояснення: github.com/docker/docker.github.io/isissue/…
aleclarson

4
Зверніть увагу, що це не працює на Docker для Windows - він просто повідомляє 0 для всього.
Майк Крістенсен

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

РОЗМІР = 100 Мб для контейнера вимкнено
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-глибина 2".
dr-jan

2
На Mac це показує /var/lib/docker/devicemapper: No such file or directory. Будь-яка ідея, де devicemapper зберігається на mac?
Маркус

Маркус: якщо ви використовуєте boot2docker, вам потрібно виконати duкоманду всередині вашої VM хост-програми boot2docker. Команда також може не вдатися, якщо ви використовуєте aufsзамість пристрою відображення пристрою.
Джеймс

як щодо 'docker ps -q', щоб перерахувати хеші контейнерів замість awk / tail?
Ендрю Вулф

На моїй установці Ubuntu 14.04 / Docker 1.10.2 розмір контейнера завжди порожній.
mhvelplund

22

Об'ємна частина більше не працює, тому якщо хтось зацікавлений, я просто трохи зміню вищевказаний сценарій:

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 розміщує файли зображень у ~ / Бібліотека / Контейнери / 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 ) Цей шар - це те, що я маю на увазі, або будь-які інші томи, які встановлені до контейнера через "volumes-from" тощо.
AlonL

1
Може, цей інструмент допоможе? github.com/cpuguy83/docker-volumes Посилання з контейнеру42.com/
Брайан

1
Дякую, це не задовольняє моїх потреб, але це приємний інструмент.
AlonL

10

Я використовую docker stats $(docker ps --format={{.Names}}) --no-streamдля отримання:

  1. Використання процесора,
  2. Використання пам’яті / Загальна пам’ять, виділена контейнеру (можна виділити за допомогою команди запуску докера)
  3. Мем%
  4. Блок вводу / виводу
  5. Чистий введення-вивід

8

Можна використовувати

docker history IMAGE_ID

щоб побачити, як розмір зображення розподіляється між різними його компонентами.


4

Майте на увазі, що docker ps --sizeдорога команда може зайняти більше кількох хвилин. Те саме стосується запитів API списку контейнерів із size=1. Краще не запускати його занадто часто.

Ознайомтеся з альтернативами, які ми зібрали, включаючи du -hsопцію для постійної каталогу томів докера.


Не на моєму сервері - працює в мілісекундах. Застереження YMMV до вищезазначеного (тест, як Сергій каже "... може ...")
Тодд Каррі

Я також тестую, все ще прийнятно використовувати docker ps --size
andikurnia

3

Покращення прихильника Maxime:

docker ps --size

Ви побачите щось подібне:

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

При запуску контейнера зображення, з якого контейнер запускається, монтується лише для читання (віртуального) .
Поверх цього монтується шар, що записується, в який записуються будь-які зміни, внесені до контейнера.

Тож віртуальний розмір (183 МБ у прикладі) використовується лише один раз, незалежно від того, скільки контейнерів запускається з одного зображення - я можу запустити 1 контейнер або тисячу; не використовується додаткового місця на диску .
"Розмір" (2B в прикладі) унікальний на контейнер, тому загальний простір, який використовується на диску, становить:

183MB + 5B + 2B

Майте на увазі, що показаний розмір не включає весь диск на диску, який використовується для контейнера.
Речі, які зараз не включені, є;
- томи
- заміна
- контрольні точки
- дисковий простір, що використовується для файлів журналів, створених контейнером

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.