想知道 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)方式进行操作。
如果您想分享对此方法的任何反馈、评论或建议,请在下面的评论部分留下您的想法