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


258

我可以看到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”以分析磁盘使用情况。它似乎正在工作,但不适用于使用“ volumes-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”容器的大小?


如果要减小多层图像的大小,我可以推荐Jason Wilder的docker-squash实用程序。从GitHub上获取它:github.com/jwilder/docker-squash
mhvelplund

在Mac OS X上,存在一个未解决的问题“ Docker无法释放磁盘空间...”:github.com/docker/for-mac/issues/371
asmaier

Answers:


459

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

docker ps --size

25
请注意,docker ps --size可能需要几分钟才能完成,并且会在主机上产生沉重的IO:github.com/axibase/axibase-collector-docs/blob/master/jobs/…–
Sergei Rodionov,

5
我还注意到,运行docker ps -s不会将/ var / lib / docker /中保存的日志考虑在内。
2017年

17
它输出两个值,这样27.2MB (virtual 173MB)它们之间有什么区别?
Mohammed Noureldin

11
@MohammedNoureldin这是一个解释:github.com/docker/docker.github.io/issues/…–
aleclarson

4
请注意,这在Windows的Docker上不起作用-它仅报告所有内容为0。
Mike Christensen

302

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 = 100MB。
danilo

SIZE = 100MB,用于关闭容器
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

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


8
“ du -d 2”在我的Centos系统上不起作用,我不得不使用“ du --max-depth 2”。
dr-jan 2015年

2
在Mac上显示/var/lib/docker/devicemapper: No such file or directory。知道devicemapper在Mac上的存储位置吗?
Markus'Apr

Markus:如果使用的是boot2docker,则必须du在boot2docker主机VM内运行命令。如果使用aufs而不是设备映射器,该命令也会失败。
2015年

'docker ps -q'列出容器的哈希而不是awk / tail怎么样?
安德鲁·沃尔夫

在我的Ubuntu 14.04 / Docker 1.10.2安装中,容器大小始终为空白。
mhvelplund '16

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 /中,而不是/ var / lib / docker / aufs中。不包含.Id或.Name的文件名:-(
paul_h

10

(此答案没有用,但由于某些评论可能会保留在此处)

docker images将显示“虚拟大小”,即包括所有较低层在内的总数。因此,如果您有共享相同基本映像的容器,则需要进行一些重复计算。

文件资料


3
我不是在谈论图像,而是在谈论容器(通过运行“ docker ps”显示的列表)。
AlonL 2014年

1
容器就像过程。他们没有磁盘空间。
Bryan 2014年

2
“ docker run命令首先在指定的映像上创建一个可写的容器层...”(docs.docker.com/v1.1/reference/commandline/cli)该层是我的意思,或者是安装的任何其他卷通过“体积-来源”等到达集装箱
AlonL 2014年


1
谢谢,它不能满足我的需求,但这是一个很好的工具。
AlonL 2014年

10

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

  1. CPU使用率,
  2. 内存使用情况/分配给容器的总内存(可以使用docker run命令分配)
  3. 记忆%
  4. 块I / O
  5. 净I / O

8

您可以使用

docker history IMAGE_ID

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


4

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

看一下我们编译的替代方案,包括du -hsdockerpersistent volume目录的选项。


在我的服务器上不是这种情况-以毫秒为单位运行。YMMV警告上述内容(测试,如Sergei所说的“ ...可能...”)
Todd Curry

我也在测试,使用docker ps --size
andikurnia '18

3

改善马克西姆的答案:

docker ps --size

您会看到以下内容:

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

启动容器时,启动容器的映像是只读(虚拟)的
最重要的是,安装了一个可写层,其中写入了对容器所做的任何更改。

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

183MB + 5B + 2B

请注意,显示的大小并不包括用于容器的所有磁盘空间。
当前不包括的东西是;
-卷
-交换
-检查点
-容器生成的用于日志文件的磁盘空间

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.