如何检查 Docker 映像、容器和卷的磁盘空间使用情况

想知道 Docker 在您的 Linux 系统上占用了多少空间?

首先,所有 Docker 镜像、容器和其他相关实体都位于 /var/lib/docker. 您可以检查此目录的大小并获取 Docker 使用的总磁盘空间:

[email protected]:~$ sudo du -sh /var/lib/docker
4.9G	/var/lib/docker

但这不是很有描述性,您可能需要在此目录中进一步查看哪个组件使用了哪些空间。

值得庆幸的是,Docker 提供了工具来以更有用的方式获取这些信息。

检查 Docker 磁盘空间使用情况 [The Docker Way]

了解映像、容器、本地卷或 构建缓存 是:

docker system df

当您运行此命令时(使用 sudo 如有必要),您将获得按 Docker 组件分组的所有磁盘使用信息。

[email protected]:~$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          4         4         1.065GB   0B (0%)
Containers      4         4         5.705kB   0B (0%)
Local Volumes   7         7         1.108GB   0B (0%)
Build Cache     0         0         0B        0B

这绝对比查看 /var/lib/docker 的总大小要好。 您可以看到图像、容器和卷消耗了多少空间。

但是,这仍然提供了一个清晰的图片,即哪个图像或体积占用了更多空间。

事实上,确实如此。 这 docker system df 命令具有详细选项 -v 这给出了所有这些细节。

docker system df -v

这是详细的输出:

[email protected]:~$ docker system df -v
Images space usage:

REPOSITORY                               TAG       IMAGE ID       CREATED         SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
ghost                                    4.32.0    b40265427368   8 weeks ago     468.8MB   0B            468.8MB       1
jrcs/letsencrypt-nginx-proxy-companion   latest    037cc4751b5a   13 months ago   24.35MB   0B            24.35MB       1
jwilder/nginx-proxy                      latest    509ff2fb81dd   15 months ago   165MB     0B            165MB         1
mariadb                                  10.5.3    f5d2bcaf057b   20 months ago   407MB     0B            407MB         1

Containers space usage:

CONTAINER ID   IMAGE                                    COMMAND                  LOCAL VOLUMES   SIZE      CREATED        STATUS        NAMES
899cc90e85d9   ghost:4.32.0                             "docker-entrypoint.s…"   1               0B        8 weeks ago    Up 8 weeks    ghost_ghost_6
17b58fdafbce   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   4               571B      3 months ago   Up 2 months   letsencrypt-proxy-companion
58f99f46ee03   jwilder/nginx-proxy                      "/app/docker-entrypo…"   5               5.13kB    3 months ago   Up 2 months   jwilder-nginx-proxy
fb907286b60e   mariadb:10.5.3                           "docker-entrypoint.s…"   1               2B        3 months ago   Up 2 months   ghost_db_1

Local Volumes space usage:

VOLUME NAME                      LINKS     SIZE
ghostdb                          1         434.7MB
jwilder-nginx-with-ssl_acme      2         36.09kB
jwilder-nginx-with-ssl_certs     2         25.12kB
jwilder-nginx-with-ssl_dhparam   1         1.525kB
jwilder-nginx-with-ssl_html      2         1.106kB
jwilder-nginx-with-ssl_vhost     2         556B
ghost                            1         674MB

Build cache usage: 0B

CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED

这很好,对吧? 还有其他方法。

检查 docker 图像大小

如果您只想查看 Docker 映像及其大小,也可以使用以下命令:

docker image ls

它列出了系统上的所有 Docker 映像,并提供了一些详细信息,包括大小:

[email protected]:~$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
busybox       latest    beae173ccac6   6 weeks ago     1.24MB
ubuntu        latest    fb52e22af1b0   5 months ago    72.8MB
alpine        latest    49f356fa4513   10 months ago   5.61MB
hello-world   latest    d1165f221234   11 months ago   13.3kB

检查正在运行的容器大小

同样,如果你想知道正在运行的 Docker 容器的大小,可以使用 docker ps 命令:

docker ps --size

您应该会看到命令输出中添加了一个 SIZE 列:

[email protected]:~$ docker ps --size
CONTAINER ID   IMAGE     COMMAND      CREATED         STATUS         PORTS     NAMES           SIZE
1171dcfb7e06   alpine    "sleep 10"   10 months ago   Up 9 seconds             always-policy   0B (virtual 5.61MB)

您是否注意到它是如何显示 0B 然后显示虚拟 5.61 MB 的? 虚拟大小包括共享的底层图像。

让我们更具体地回到 Linux 方法,使用 高山 图像和容器作为动手 example.

使用标准 Linux 命令分析 Docker 磁盘空间使用情况

每当您使用 docker pull 命令或运行 docker-compose up -d 为了准备应用程序的启动,这是您查找图像空间使用情况的方式,实际上存储在 Ubuntu 20.04 服务器上:

sudo du -sh /var/lib/docker/overlay2/<hash-named-directory>/

这里,Overlay2 是默认的 Docker 存储驱动程序 在 Ubuntu 上。 您可以通过运行 docker info 命令并寻找存储驱动程序:

Storage Driver: overlay2

如果这与您的不同,那么您正在为 Docker 使用不同的存储驱动程序。 同样,目录位置将根据相同的存储驱动程序命名。 存储驱动程序的可用性取决于内核支持。

特定映像磁盘使用情况

如果您正在寻找特定图像的位置,您可以使用 Docker 检查命令来获取拉取的图像。 说,对于 example,我已经用 docker pull alpine. 运行以下命令来检查它:

$ docker inspect alpine

运行命令后,您会注意到其中的三个字段 Data 下小节 GraphDriver

...
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/merged",
                "UpperDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
                "WorkDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/work"
            },

...

根据以上信息,可以看到(前面提到过 du 命令语法)在这种情况下是 64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e.

在这里,您可以运行以下命令来显示 Alpine 映像使用的空间量:

[email protected]:~$ sudo du -sh /var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
6.0M	/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e

同样,像图像一样,容器也存储在同一个基于存储驱动程序的目录中。

/var/lib/docker/overlay2

特定容器磁盘使用情况

如果您正在寻找特定容器的位置,您可以再次使用 inspect Docker 上用于运行容器的命令。 说,对于 example,我已经运行了 alpine 容器 docker run -ti -d alpine . 当你跑 docker ps,你会看到它正在运行:

$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
cb341d6a28fa   alpine    "/bin/sh"   6 seconds ago   Up 5 seconds             confident_banzai

在这里,容器被随机命名 confident_banzai. 所以让我们检查一下:

$ docker inspect confident_banzai

运行上述命令后,您会注意到前面提到的所有四个字段 Data 下小节 GraphDriver. 这些位置是容器数据物理存储在主机系统上的位置,就像您在图像中看到的那样:

...
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3-init/diff:/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
                "MergedDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/merged",
                "UpperDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/diff",
                "WorkDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/work"
            },
            "Name": "overlay2"
        },
...

现在您可以使用 du 再次命令:

[email protected]:~$ sudo du -sh /var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3
32K	/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3

与 Docker 映像和容器不同,卷的物理位置非常简单。 卷位于:

/var/lib/docker/volumes/

因此,您可以运行以下命令来了解系统上整个 Docker 卷的磁盘空间使用情况:

avimanyu @iborg-desktop:~$ sudo du -sh /var/lib/docker/volumes/
60K	/var/lib/docker/volumes/

特定卷磁盘使用情况

在这种情况下,主要有两种类型。 一个是常规 Docker 卷,另一个是绑定挂载。

Docker 卷

如果要查找特定卷的位置,可以使用 docker volume ls 首先命令并检查卷名或 ID。 说,对于 example,我已经使用以下命令运行了 alpine 容器,其中包含一个卷:

docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine

现在,一个名为 test-data 将自动创建。 现在让我们创建一个名为 test.md 在这个位置内:

$ docker exec alpine-container sh -c "touch /var/lib/app/content/test.md"

验证文件确实已创建:

$ docker exec -ti alpine-container sh
/ # ls /var/lib/app/content/
test.md
/ # exit

当你跑 docker volume ls卷名为 test-data 将列出:

$ docker volume ls
DRIVER    VOLUME NAME
local     d502589845f7ae7775474bc01d8295d9492a6c26db2ee2c941c27f3cac4449d1
local     e71ee3960cfef0a133d323d146a1382f3e25856480a727c037b5c81b5022cb1b
local     test-data

最后,您可以确认文件在主机系统上的实际位置:

$ sudo ls -l /var/lib/docker/volumes/test-data/_data
total 0
-rw-r--r-- 1 root root 0 Oct  6 23:20 test.md

因此,挂载卷的路径始终位于名为 _data 在各自的卷目录中。

因此,您可以使用 du 再次在此处命令特定卷!:

[email protected]:~$ sudo du -sh /var/lib/docker/volumes/test-data/_data
4.0K	/var/lib/docker/volumes/test-data/_data

每次您想了解您的卷使用了多少空间时,请务必记下卷名。

绑定坐骑

这是 Docker 中唯一的例外,您必须使用 Linux 方法来监控磁盘空间使用情况。 同时,最好先停止正在运行的容器。

$ mkdir /home/avimanyu/test-data
$ docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine

在这种情况下,一个名为 test-data 将在容器端可用 /var/lib/app/content.

[email protected]:~$ sudo du -sh /home/avimanyu/test-data
4.0K	/home/avimanyu/test-data

您还可以在容器内测试相同的内容:

[email protected]:~$ sudo docker exec -ti alpine-container sh
/ # du -sh /var/lib/app/content
4.0K	/var/lib/app/content

如您所见,上面报告的两个大小是相同的,因为它们实际上是绑定安装。

主机上的 Docker 日志始终存储在卷中。 使用本节中描述的方式,用户还可以通过查看 docker 卷磁盘空间使用情况进行导航和查找。 这因应用程序和应用程序卷中日志文件的位置而异。

奖金提示

根据您到现在所学的知识,很明显,您还可以使用以下命令同时获取图像和容器的磁盘使用情况:

sudo du -sh /var/lib/docker/overlay2

主机上的 Docker 日志始终存储在卷中。 通常较大的 Docker 卷很可能表明日志已经堆积并且管理效率低下。

使用本文卷部分中描述的方式,用户还可以通过查看 docker 卷磁盘空间使用情况来导航和缓解这种情况。 这因应用程序和应用程序卷中日志文件的位置而异。

概括

在本教程中,我采用了一种基于 Linux 的通用方法,向您展示了如何在主机级别找出驻留在 Linux 服务器上的 Docker 映像、容器和卷的磁盘空间占用情况。 您还学习了如何以首选(Docker)方式进行操作。

如果您想分享对此方法的任何反馈、评论或建议,请在下面的评论部分留下您的想法