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

如何分析Docker容器的磁盘使用情况,docker,lxc,device-mapper,Docker,Lxc,Device Mapper,我可以看到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 但是,我如何知道这是如

我可以看到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 bash
然后运行'df-h'来分析磁盘使用情况。它似乎可以工作,但不适用于使用“卷自”的容器

例如,我为MongoDB使用了一个只包含数据的容器,称为“mongo数据”

当我从mongo data busybox运行
docker run-it--volumes,然后在容器内运行
df-h
时,它会说安装在
/data/db
(我的“mongo data”data only容器)上的文件系统使用11.3G,但当我运行
du-h/data/db
时,它会说它只使用2.1G

那么,如何分析容器/卷磁盘使用情况?或者,在我的例子中,如何确定“mongo数据”容器的大小?

(这个答案没有用处,但将它留在这里,因为一些注释可能是有用的)

docker图像
将显示“虚拟大小”,即包括所有较低层的总大小。因此,如果容器共享相同的基本映像,则会重复计算


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

列出容器的大小:

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

注意:根据Docker文件系统(例如“aufs”)更改“devicemapper”

卷部分不再工作,因此如果安装了任何人,我只需稍微更改上面的脚本:

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

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

docker ps --size

请记住,
docker ps--size
可能是一个代价高昂的命令,需要几分钟以上的时间才能完成。这同样适用于
size=1
的容器列表API请求。最好不要太频繁地运行它


看看我们编译的,包括docker持久卷目录的
du-hs
选项。

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 history IMAGE_ID
查看图像大小如何在其各个子组件之间分配。

我使用
docker stats$(docker ps--format={{.Names}})--无流
获取:

  • CPU使用率
  • 内存使用/分配给容器的总内存(可使用docker run命令进行分配)
  • 成员%
  • 块I/O
  • 净I/O

  • 改进Maxime的anwser:

    docker ps--尺寸

    您将看到如下内容:

    +---------------+---------------+--------------------+
    | CONTAINER ID  | IMAGE         | SIZE               |
    +===============+===============+====================+
    | 6ca0cef8db8d  | nginx         | 2B (virtual 183MB) |
    | 3ab1a4d8dc5a  | nginx         | 5B (virtual 183MB) |
    +---------------+---------------+--------------------+
    
    启动容器时,从中启动容器的映像将以只读方式装入(虚拟)
    在此之上,安装了一个可写层,其中写入对容器所做的任何更改

    因此,虚拟大小(本例中为183MB)仅使用一次,无论从同一图像启动多少个容器-我可以启动1个或1000个容器未使用额外的磁盘空间
    不过,每个容器的“大小”(示例中为2B)是唯一的,因此磁盘上使用的总空间为:

    183MB+5B+2B

    请注意,显示的大小不包括容器使用的所有磁盘空间。
    当前未包含的内容包括:
    -数量
    -交换
    -检查点
    -用于容器生成的日志文件的磁盘空间

    docker ps的替代品--尺寸 由于“docker ps--size”在主机上产生了沉重的IO负载,所以不可能在生产环境中每分钟都运行这样的命令。因此,为了获得所需的容器大小,或者更精确地说,RW层的大小对系统性能的影响较小,我们必须采取变通措施

    这种方法收集每个容器的“设备名”,然后使用“df”命令检查其大小。这些“设备名称”是装载到每个容器上的精简配置卷。一个问题仍然存在,因为观察到的大小还意味着基础图像的所有只读层。为了解决这个问题,我们可以简单地检查所用容器图像的大小,并从设备/精简卷的大小中减去它

    应该注意的是,在使用设备映射器时,每个图像层都是作为一种lvm快照实现的。不幸的是,我无法让rhel系统打印出这些快照/图层。否则,我们可以简单地收集“最新”快照的大小。如果有人能把事情说清楚就好了。然而

    在一些测试之后,似乎创建容器总是会增加约40毫巴的开销(使用基于图像“httpd:2.4.46-alpine”的容器进行测试):

  • docker run-d——名称apache-httpd:2.4.46-alpine//现在从docker-inspect获取设备名称,并使用df进行查找
  • df-T->90MB,而“docker ps--Size”中的“虚拟大小”表示50MB,负载非常小,为2字节->40MB
  • 在容器中卷曲/下载100MB文件
  • df-T->190MB,而“docker ps--Size”中的“虚拟大小”表示150MB,负载为100MB->开销为40MB
  • 下面的shell打印匹配“docker ps--size”结果的结果(以字节为单位)(但请记住前面提到的40MB开销)

    以美元计价的c的
    (docker ps-q);做\
    容器_name=$(docker-inspect-f“{.name}}”${c}| sed's/^\///g')\
    device_n=$(docker inspect-f“{.GraphDriver.Data.DeviceName}}”${c}sed's/*-//g')\
    device_size_kib=$(df-T | grep${device_n}| awk'{print$4}')\
    设备大小字节=$((1024*${device大小\u kib}))\
    image_sha=$(docker inspect-f“{.image}}”${c}| sed's/*://g')\
    image_size_byte=$(docker image inspect-f“{.size}}”${image_sha})\
    容器大小字节=$(${device大小字节}-${image大小字节}))\
    \
    回显我的\u节点\u dm\u设备\u大小\u字节\{cname=\“${container\u name}\”\}${devi
    
    $ docker system df --verbose
    
    docker history IMAGE_ID
    
    +---------------+---------------+--------------------+
    | CONTAINER ID  | IMAGE         | SIZE               |
    +===============+===============+====================+
    | 6ca0cef8db8d  | nginx         | 2B (virtual 183MB) |
    | 3ab1a4d8dc5a  | nginx         | 5B (virtual 183MB) |
    +---------------+---------------+--------------------+
    
    docker ps -s