Как проанализировать использование диска контейнера Docker

259

Я вижу, что 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', чтобы проанализировать использование диска. Кажется, что он работает, но не с контейнерами, которые используют «volume-from».

Например, я использую контейнер данных только для MongoDB, который называется «Монго-данные».

Когда я запускаю docker run -it --volumes-from mongo-data busybox, а затем df -hвнутри контейнера, он говорит, что файловая система, смонтированная в /data/db(мой контейнер только для данных «mongo-data»), использует 11.3G, но когда я это делаю du -h /data/db, он говорит, что он использует только 2.1G.

Итак, как мне проанализировать использование диска контейнера / тома? Или, в моем случае, как узнать размер контейнера «mongo-data»?

AlonL
источник
Если вы хотите уменьшить размер многослойных изображений, я могу порекомендовать docker-squashутилиту Джейсона Уайлдера . Получите это от GitHub здесь: github.com/jwilder/docker-squash
mhvelplund
В Mac OS X существует открытая проблема «Докер не освобождает дисковое пространство ...»: github.com/docker/for-mac/issues/371
asmaier

Ответы:

462

Чтобы увидеть размер файла ваших контейнеров, вы можете использовать --sizeаргумент docker ps:

docker ps --size
Maxime
источник
25
Обратите внимание, что docker ps --size может занять несколько минут и будет производить тяжелые операции ввода-вывода на хосте: github.com/axibase/axibase-collector-docs/blob/master/jobs/…
Сергей Родионов
5
Я также заметил, что при запуске docker ps -sне учитываются журналы, хранящиеся в / var / lib / docker /.
Demee
17
Он выводит два значения, вот 27.2MB (virtual 173MB)какова разница между ними?
Мохаммед Нурельдин
11
@MohammedNoureldin Вот объяснение: github.com/docker/docker.github.io/issues/…
aleclarson
4
Обратите внимание, что это не работает в Docker для Windows - он просто сообщает 0 для всего.
Майк Кристенсен
304

После 1.13.0 Docker включает новую команду, docker system dfчтобы показать использование диска 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%)

Чтобы показать более подробную информацию об использовании пространства:

$ docker system df --verbose
Хемерсон Варела
источник
Одна полезная команда, если у вас много компонентов:docker system df --verbose > docker.stats-2019-07-18.log
joseluisq
что означает столбец SIZE контейнера? У меня отключены некоторые контейнеры, и эта команда показывает SIZE = 100 МБ, например.
Данило
РАЗМЕР = 100 МБ для контейнера выкл
Данило
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»)

AlonL
источник
8
«du -d 2» не работает в моей системе Centos, вместо этого мне пришлось использовать «du --max-deep 2».
Dr-Jan
2
На Mac это видно /var/lib/docker/devicemapper: No such file or directory. Любая идея, где устройство устройства хранится на Mac?
Маркус
Markus: если вы используете boot2docker, вы должны выполнить duкоманду внутри вашей виртуальной машины 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
Хуанито
источник
Точки монтирования! = Тома
derFunk,
Mac Docker 1.12.1 помещает файлы изображений в ~ / Library / Containers / com.docker.docker / not / var / lib / docker / aufs. Имена файлов, для которых нет .Id или .Name :-(
paul_h
10

(этот ответ бесполезен, но оставим его здесь, так как некоторые комментарии могут быть)

docker imagesпокажет «виртуальный размер», то есть сколько всего, включая все нижние уровни. Так что некоторый двойной счет, если у вас есть контейнеры, которые используют один и тот же базовый образ.

документация

Bryan
источник
3
Я говорю не об изображениях, а о контейнерах (список показывается с помощью команды «docker ps»).
AlonL
1
Контейнеры похожи на процессы; у них нет места на диске.
Брайан
2
«Команда docker run сначала создает записываемый контейнерный слой над указанным образом ...» ( docs.docker.com/v1.1/reference/commandline/cli ) Этот слой - то, что я имею в виду, или любые другие тома, которые смонтированы в контейнер через «тома-от» и т. д.
AlonL
1
Может быть, этот инструмент поможет? github.com/cpuguy83/docker-volumes Ссылка на container42.com/2014/11/03/docker-indepth-volumes
Брайан,
1
Спасибо, это не удовлетворяет мои потребности, но это хороший инструмент.
AlonL
9

Я использую, docker stats $(docker ps --format={{.Names}}) --no-streamчтобы получить:

  1. Использование процессора,
  2. Использование памяти / общее количество памяти, выделенной контейнеру (можно выделить командой запуска docker)
  3. Mem%
  4. Блок ввода / вывода
  5. Чистый ввод / вывод
Абхишек Джайн
источник
8

Ты можешь использовать

docker history IMAGE_ID

чтобы увидеть, как размер изображения распределяется между его различными подкомпонентами.

EiTan LaVi
источник
4

Имейте в виду, что это docker ps --sizeможет быть дорогой командой, которая может занять больше нескольких минут. То же самое относится к запросам API списка контейнеров с size=1. Лучше не запускать его слишком часто.

Взгляните на скомпилированные нами альтернативы , включая du -hsопцию для каталога постоянных томов docker.

Сергей Родионов
источник
Дело не в моем сервере - работает в миллисекундах. Предостережение YMMV к вышесказанному (тест, как говорит Сергей "... может ...")
Тодд Карри
Я также тестирую, все еще приемлемо использовать докер ps --size
andikurnia
3

Улучшение ответа Максима:

docker ps --size

Вы увидите что-то вроде этого:

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

При запуске контейнера образ, из которого запускается контейнер, монтируется только для чтения (виртуальный) .
Кроме того, монтируется записываемый слой, в который записываются любые изменения, сделанные в контейнере.

Таким образом, виртуальный размер (183 МБ в примере) используется только один раз, независимо от того, сколько контейнеров запущено из одного образа - я могу запустить 1 контейнер или тысячу; дополнительное дисковое пространство не используется .
«Размер» (в примере 2B) уникален для каждого контейнера, поэтому общее пространство, используемое на диске:

183MB + 5B + 2B

Имейте в виду, что указанный размер не включает все дисковое пространство, используемое для контейнера.
Вещи, которые не включены в настоящее время;
- volume
- swapping
- checkpoints
- дисковое пространство, используемое для log-файлов, сгенерированных контейнером

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

Данило
источник