如何分析Docker容器的磁盘使用情况

问题描述 投票:193回答:9

我可以看到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上的文件系统(我的'mongo-data'数据专用容器)使用11.3G,但是当我做du -h /data/db时,它说它只使用2.1G 。

那么,我如何分析容器/卷磁盘的使用情况呢?或者,在我的情况下,我如何找出'mongo-data'容器大小?

linux docker lxc volumes device-mapper
9个回答
384
投票

要查看容器的文件大小,可以使用--sizedocker ps参数:

docker ps --size

233
投票

在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

30
投票

将此作为答案发布,因为我上面的评论被隐藏了:

列出容器的大小:

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

注意:根据您的Docker文件系统更改'devicemapper'(例如'aufs')


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

10
投票

(这个答案没用,但是因为有些评论可能会留在这里)

docker images将显示“虚拟大小”,即包括所有较低层的总数。如果你有共享相同基本图像的容器,那么有些重复计算。

documentation


6
投票

您可以使用

docker history IMAGE_ID

了解图像大小如何在其各个子组件之间分配。


6
投票

我用docker stats $(docker ps --format={{.Names}}) --no-stream得到:

  1. CPU使用率,
  2. 内存使用/分配给容器的总mem(可以使用docker run命令分配)
  3. MEM%
  4. 阻止I / O.
  5. 净I / O.

4
投票

如果你想减少多层图像的大小,我可以推荐Jason Wilder的docker-squash实用程序。从这里获取GitHub:https://github.com/jwilder/docker-squash


3
投票

请记住,docker ps --size可能是一个昂贵的命令,需要花费几分钟才能完成。这同样适用于使用size=1的容器列表API请求。最好不要经常运行它。

看一下我们编译的alternatives,包括docker persistent volume目录的du -hs选项。

© www.soinside.com 2019 - 2024. All rights reserved.