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

Я вижу, что 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, который называется "mongo-data".

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

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

Ответ 1

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

docker ps --size

Ответ 2

После 1.13.0 Docker включает новую docker system df командных докеров 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

Ответ 3

Проводя это как ответ, потому что мои комментарии выше были скрыты:

Укажите размер контейнера:

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" )

Ответ 4

Часть тома больше не работала, поэтому, если кто-то невзрачен, я немного изменил выше script:

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

docker history IMAGE_ID

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

Ответ 8

Если вы хотите уменьшить размер многослойных изображений, я могу порекомендовать Jason Wilder docker-squash. Получите его от GitHub здесь: https://github.com/jwilder/docker-squash

Ответ 9

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

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