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

Alo*_*onL 222 lxc device-mapper docker

我已经搜索了一段时间,但找不到分析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
Run Code Online (Sandbox Code Playgroud)

但是,我怎么知道这是如何分布在容器上的呢?

我尝试通过运行附加到容器(新的v1.3命令)

docker exec -it <container_name> bash
Run Code Online (Sandbox Code Playgroud)

然后运行'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'容器大小?

非常感谢,

Max*_*ime 412

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

docker ps --size
Run Code Online (Sandbox Code Playgroud)

  • 请注意,docker ps --size可能需要几分钟才能完成,并且会在主机上产生大量IO:https://github.com/axibase/axibase-collector-docs/blob/master/jobs/docker/volume-size. MD (25认同)
  • 它输出两个值,比如这个`27.2MB(虚拟173MB)`它们之间有什么区别? (14认同)
  • @MohammedNoureldin这里有一个解释:https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362 (11认同)
  • 我还注意到运行`docker ps -s`不会将/ var/lib/docker /中保存的日志考虑在内. (5认同)
  • 请注意,这在Windows的Docker上不起作用-它仅报告所有内容为0。 (4认同)

Hem*_*ela 255

在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%)
Run Code Online (Sandbox Code Playgroud)

显示有关空间使用情况的更多详细信息

$ docker system df --verbose
Run Code Online (Sandbox Code Playgroud)


Alo*_*onL 30

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

列出容器的大小:

du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>`
Run Code Online (Sandbox Code Playgroud)

列出容器卷的大小:

docker inspect -f "{{.Volumes}}" <container_name> | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h
Run Code Online (Sandbox Code Playgroud)

编辑:列出所有正在运行的容器的大小和卷:

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
Run Code Online (Sandbox Code Playgroud)

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

  • "du -d 2"在我的Centos系统上不起作用,我不得不使用"du -max-depth 2". (8认同)
  • 在Mac上它显示`/ var/lib/docker/devicemapper:没有这样的文件或目录`.知道devicemapper存储在mac上的哪个位置? (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)


dan*_*ilo 11

改进 Maxime 的 anwser:

docker ps --size

你会看到这样的东西:

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

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

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

183MB + 5B + 2B

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

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


Bry*_*yan 10

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

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

文件

  • 我不是在谈论图像,而是关于容器(通过运行'docker ps'显示的列表). (3认同)
  • "docker run命令首先在指定的图像上创建一个可写的容器层..."(https://docs.docker.com/v1.1/reference/commandline/cli/)该层是我的意思,或任何通过'volumes-from'等安装到容器的其他卷 (2认同)

eiT*_*aVi 7

您可以使用

docker history IMAGE_ID
Run Code Online (Sandbox Code Playgroud)

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


Abh*_*ain 7

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

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


Ser*_*nov 6

请记住,这docker ps --size可能是一个昂贵的命令,需要几分钟才能完成。这同样适用于带有size=1. 最好不要经常运行它。

看看我们编译的替代方案,包括du -hsdocker 持久卷目录的选项。


log*_*sex 5

该docker system df命令显示有关 docker 守护程序使用的磁盘空间量的信息。

docker system df -v
Run Code Online (Sandbox Code Playgroud)