docker 系统 df 磁盘使用情况真实和显示的区别

Diffrence between real and showed by docker system df disc usage

我在版本 18.03.1-ce 中有 docker 支持命令 docker system df。他的输出:

Images space usage:

REPOSITORY                               TAG                 IMAGE ID            CREATED ago             SIZE                SHARED SIZE         UNIQUE SiZE         CONTAINERS
registry.gitlab.com/precisesale/app      latest              b7833546c2cf        About an hour ago ago   252.1MB             123.8MB             128.4MB             1
healthdiary/app                          latest              565c6d3906e6        2 days ago ago          312.2MB             123.8MB             188.4MB             1
mongo                                    latest              f93ff881751f        5 days ago ago          367.6MB             0B                  367.6MB             2
nginx                                    latest              b175e7467d66        6 weeks ago ago         108.9MB             0B                  108.9MB             1
jwilder/docker-gen                       latest              8959ee34c769        2 months ago ago        19.91MB             4.148MB             15.77MB             1
jrcs/letsencrypt-nginx-proxy-companion   latest              17939ceb7a52        2 months ago ago        86.86MB             4.148MB             82.71MB             1

Containers space usage:

CONTAINER ID        IMAGE                                    COMMAND                  LOCAL VOLUMES       SIZE                CREATED ago         STATUS              NAMES
c20dc3438552        healthdiary/app                          "./entrypoint.sh nod…"   0                   0B                  8 minutes ago ago   Up 8 minutes        healthdiary_app_1
bf8c4307dcbb        mongo:latest                             "docker-entrypoint.s…"   1                   0B                  8 minutes ago ago   Up 8 minutes        healthdiary_mongo_1
47fced8d18fe        registry.gitlab.com/precisesale/app      "./entrypoint.sh nod…"   0                   0B                  9 minutes ago ago   Up 9 minutes        precisesale_app_1
597d97d5c1fa        mongo:latest                             "docker-entrypoint.s…"   1                   0B                  9 minutes ago ago   Up 9 minutes        precisesale_db_1
b5bb14faa910        jwilder/docker-gen                       "/usr/local/bin/dock…"   0                   0B                  7 hours ago ago     Up 19 minutes       nginx-gen
8eee2bee084a        nginx                                    "nginx -g 'daemon of…"   0                   2B                  7 hours ago ago     Up 19 minutes       nginx-web
6b8b0cd5d938        jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   0                   1.66kB              7 hours ago ago     Up 19 minutes       nginx-letsencrypt

Local Volumes space usage:

VOLUME NAME                                                        LINKS               SIZE
0a40fac6ca98e776dad972c8193362a51a485b3305979e58996545d97310a3c7   1                   0B
929b0b88849ad4d390efd4666e6a0e5f82e0e6dd34f7a09f609de90b190e6148   1                   0B

Build cache usage: 0B

即使我不考虑来自两个第一个容器的共享 space 的节省,摘要大小也是 1147.5 MB

但是如果我通过 du 测量光盘上 docker overlay2 的大小,我得到

du -hs /var/lib/docker/overlay2/
2.7G    /var/lib/docker/overlay2/

docker system dfdu测量的容器尺寸不同的原因在哪里?

前段时间我也在想同样的事情。 这不是错误,这是一个功能:-)

du -sh /var/lib/docker/overlay2

未显示 objective 值,因为已使用覆盖驱动程序安装合并文件夹,并且 du 输出不是实际的磁盘分配大小。

您可以通过仅检查 diff 文件夹来查看实际的磁盘分配大小,例如:

du -shc /var/lib/docker/overlay2/*/diff

您可以像这样在您的环境中进行测试: 运行

df -h /dev/sd*
du -shc /var/lib/docker/overlay2/*/diff
du -sh /var/lib/docker/overlay2

现在启动 20 个 centos 容器并观察有什么变化:

for i in {1..20}; do docker run -itd centos bash; done
df -h /dev/sd*
du -shc /var/lib/docker/overlay2/*/diff
du -sh /var/lib/docker/overlay2

可以看到实际的磁盘分配(df命令)只比之前多了cca 200MB,但是整个文件夹的“du”输出了4.2G的分配。 “diff”文件夹上的“du”显示 212M 是正确的。

这就是 Docker 的工作原理以及它的伟大之处!