如何列出和删除Docker镜像?

Docker是一个众所周知的平台,允许您将应用程序作为容器管理、运行和发送,这些容器将操作系统和依赖库与您的应用程序一起打包。

我们将介绍如何管理Docker镜像,主要涉及列出Docker镜像的方法、获取所需信息以及构建在此学习基础上以高效方式删除一个或多个镜像。

所以让我们开始吧。

列出Docker镜像

要列出已拉取的Docker镜像,请使用:

abhisheknair@yaoweibin:~$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
redis         latest    aa4d65e670d6   9天前           105MB
mysql         latest    c60d96bd2b77   10天前          514MB
ubuntu        latest    c29284518f49   2周前           72.8MB
nginx         latest    4cdc5dd7eaad   3周前           133MB
hello-world   latest    d1165f221234   4个月前          13.3kB
redis         4.0       191c4017dcdd   15个月前         89.3MB
abhisheknair@yaoweibin:~$

与其他docker命令一样,它支持带有多个选项的images命令。

 $ docker images [OPTIONS] [REPOSITORY[:TAG]]

如果您运行不带任何选项的docker images,它将显示顶级镜像,如docker image ls,它们的仓库和标签以及它们在磁盘上的大小。

abhisheknair@yaoweibin:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    c60d96bd2b77   10天前          514MB
ubuntu        latest    c29284518f49   2周前           72.8MB
nginx         latest    4cdc5dd7eaad   3周前           133MB
hello-world   latest    d1165f221234   4个月前          13.3kB
redis         4.0       191c4017dcdd   15个月前         89.3MB
abhisheknair@yaoweibin:~$

这些镜像具有增加可用性、加快构建过程并减少磁盘使用的中间层,这些在上述命令中不显示。 SIZE是镜像及其所有父镜像占用的组合空间。如果在save镜像时将镜像的内容保存为Tar文件,则其大小等于此列表中列出的大小。

如果镜像有多个仓库名称或标签,则该镜像将被列出多次,尽管通过其IMAGE ID标识的单个镜像仅列出一次。

列出最近的镜像

abhisheknair@yaoweibin:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mysql         latest    c60d96bd2b77   10天前          514MB
ubuntu        latest    c29284518f49   2周前           72.8MB
nginx         latest    4cdc5dd7eaad   3周前           133MB
hello-world   latest    d1165f221234   4个月前          13.3kB
redis         4.0       191c4017dcdd   15个月前         89.3MB
abhisheknair@yaoweibin:~$

按仓库和标签列出镜像

要列出属于特定仓库的所有镜像,请指定仓库名称,例如:

abhisheknair@yaoweibin:~$ docker images redis
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        latest    aa4d65e670d6   9天前           105MB
redis        4.0       191c4017dcdd   15个月前         89.3MB
abhisheknair@yaoweibin:~$

您还可以使用标签指定仓库名称,以获得更多过滤后的输出:

abhisheknair@yaoweibin:~$ docker images redis:4.0
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        4.0       191c4017dcdd   15个月前         89.3MB
abhisheknair@yaoweibin:~$

列出完整的镜像ID

要列出所有镜像而不截断IMAGE ID,请使用:

abhisheknair@yaoweibin:〜$ docker images –no-trunc
存储库 标签 镜像ID 创建时间 大小
redis 最新 sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7 9天前 105MB
mysql 最新 sha256:c60d96bd2b771a8e3cae776e02e55ae914a6641139d963defeb3c93388f61707 10天前 514MB
ubuntu 最新 sha256:c29284518f497b8c5f49933e74e43ca5221e69c8251e780427f7d12f716625ff 2周前 72.8MB
nginx 最新 sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f 3周前 133MB
hello-world 最新 sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726 4个月前 13.3kB
redis 4.0 sha256:191c4017dcdd3370f871a4c6e7e1d55c7d9abed2bebf3005fb3e7d12161262b8 15个月前 89.3MB
abhisheknair@yaoweibin:〜$

列出镜像摘要

使用v2或更高版本格式的Docker镜像具有称为摘要的内容寻址标识符。要列出镜像摘要值,请使用--digest标志,如下所示:

abhisheknair@yaoweibin:~$ docker images --digests
存储库  标签   摘要                                                                    镜像ID       创建时间         大小
redis  最新   sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59   aa4d65e670d6   9天前     105MB
mysql  最新   sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd   c60d96bd2b77   10天前     514MB
ubuntu  最新   sha256:b3e2e47d016c08b3396b5ebe06ab0b711c34e7f37b98c9d37abe794b71cea0a2   c29284518f49   2周前     72.8MB
nginx  最新   sha256:c5aab9d8e259d54af91e0548abf1fa8188a43079eb86b6ba8df9f482a5380720   4cdc5dd7eaad   3周前     133MB
hello-world 最新   sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e   d1165f221234   4个月前    13.3kB
redis  4.0   sha256:2e03fdd159f4a08d2165ca1c92adde438ae4e3e6b0f74322ce013a78ee81c88d   191c4017dcdd   15个月前   89.3MB
abhisheknair@yaoweibin:〜$

使用2.0注册表,您可以在pushpullcreaterunrmi命令中使用这些摘要。这也适用于Dockerfile中的FROM命令。

过滤输出

docker命令支持使用images进行过滤,使用--filter标志。目前支持的过滤器有:

  • dangling(布尔值 – true或false)
  • label(label=label==
  • before([:]) – 过滤在给定id或引用之前创建的镜像
  • since([:]) – 过滤在给定id或引用之后创建的镜像
  • reference(镜像引用的模式) – 过滤引用与指定模式匹配的镜像

此外,您可以通过将它们组合使用来使用多个过滤器,例如:

$ docker images --filter "=" --filter"="

示例:

abhisheknair@yaoweibin:〜$ docker images –filter “before=redis” –filter “since=hello-world”
存储库 标签 镜像ID 创建时间 大小
mysql 最新 c60d96bd2b77 10天前 514MB
ubuntu 最新 c29284518f49 2周前 72.8MB
nginx 最新 4cdc5dd7eaad 3周前 133MB
abhisheknair@yaoweibin:〜$

格式化输出

docker images支持格式化输出,可能需要与其他命令嵌套,脚本或其他用途。以下是--format标志支持的占位符:

占位符 描述
.ID 镜像ID
.Repository 镜像存储库
.Tag 镜像标签
.Digest 镜像摘要
.CreatedSince 图像创建后的经过时间
.CreatedAt 图像创建时间
.Size 图像磁盘大小

例如,下面的命令打印输出没有标题,并以冒号(:)分隔的方式输出所有图像的ID和存储库:

abhisheknair@yaoweibin:〜$ docker images --format "{{.ID}}:{{.Repository}}"
aa4d65e670d6:redis
c60d96bd2b77:mysql
c29284518f49:ubuntu
4cdc5dd7eaad:nginx
d1165f221234:hello-world
191c4017dcdd:redis
abhisheknair@yaoweibin:〜$  

或者,要以表格格式列出所有图像及其存储库和标签,可以使用:

abhisheknair@yaoweibin:〜$ docker images --format "table {{.ID}}t{{.Repository}}t{{.Tag}}"
映像ID 仓库 标签
aa4d65e670d6 redis 最新
c60d96bd2b77 mysql 最新
c29284518f49 ubuntu 最新
4cdc5dd7eaad nginx 最新
d1165f221234 hello-world 最新
191c4017dcdd redis 4.0
abhisheknair@yaoweibin:〜$  

删除Docker镜像

要从系统中删除一个或多个Docker镜像,我们使用:

$ docker image rm [OPTIONS] IMAGE [IMAGE...]

要删除单个镜像,只需指定镜像名称:

abhisheknair@yaoweibin:〜$ docker image rm redis
取消标记:redis:latest
取消标记:redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59
已删除:sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7
已删除:sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2
已删除:sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9
已删除:sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e
已删除:sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d
已删除:sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68
abhisheknair@yaoweibin:〜$  

要删除多个镜像,请指定以空格分隔的多个镜像名称:

abhisheknair@yaoweibin:〜$ docker image rm redis mariadb
删除标记:redis:latest
删除标记:redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59
已删除:sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7
已删除:sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2
已删除:sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9
已删除:sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e
已删除:sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d
已删除:sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68
删除标记:mariadb:latest
删除标记:mariadb@sha256:3b6f9fa1d406e168998d62501b2ee4f27d53138bebfcdac03540758996c5ff1d
已删除:sha256:fd17f57768027456cc17987058474fb21d3c51e9dd764e4497c1dfe92ff058db
已删除:sha256:a638f04e531b032c81a84bda59a36d1df3c4cec62560c403bc2edb642bce79ba
已删除:sha256:af7a7e7bf72e7ad0c5227995f219d9094fafbe0ac973dbe7eb4ab190a5a58ba5
已删除:sha256:a0cfd81b291e8da6bca0731c9db70fe1b61d176906b1cf05ade1cd61572ffaaa
已删除:sha256:38b00cb5dab64398092fab2b18563af1ef4a9445dec8a531ac725059dc218f41
已删除:sha256:6e60d29d2d76125f989f503a78729984f7ba3e26bfbf7038d5ab644b8755b7c2
已删除:sha256:1dafdd60e471b4c1f5244cfe1d20d79f934f504ef42180b637886be2b0b74370
已删除:sha256:2fffe8e736cdb99359084e297f4bb54a4cac879366bd3e4333d3dbe966f8e9a6
已删除:sha256:f728037697805db453111266541c202c74971484ef359ea29b9c60064ed9e47e
已删除:sha256:28155a13db3520201db576bf6d56b68fc08ef27b1c4c49dbfeadef523d35c5f0
已删除:sha256:7555a8182c42c7737a384cfe03a3c7329f646a3bf389c4bcd75379fc85e6c144
abhisheknair@yaoweibin:〜$

强制删除

可能有正在运行的容器正在使用您要删除的镜像。在这种情况下,当您尝试删除引用的镜像时,Docker会向您发出警告。

abhisheknair@yaoweibin:〜$ docker image rm nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container ce908eadf829 is using its referenced image 4cdc5dd7eaad
abhisheknair@yaoweibin:〜$

您可以先停止相关容器,然后重试,否则使用-f标志强制删除镜像(请小心)。

abhisheknair@yaoweibin:〜$ docker image rm nginx -f
删除标记:nginx:latest
删除标记:nginx@sha256:c5aab9d8e259d54af91e0548abf1fa8188a43079eb86b6ba8df9f482a5380720
已删除:sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f
abhisheknair@yaoweibin:〜$

清理镜像

在某些情况下,未使用的镜像会占用磁盘空间,或者您只需要清除旧的悬空镜像。您可以通过以下方式清理此类未使用的镜像:

$ docker image prune

示例:

abhisheknair@yaoweibin:〜$ docker image prune
警告!这将删除所有悬空镜像。
您确定要继续吗? [y/N] y
总共回收的空间:0B
abhisheknair@yaoweibin:〜$

如果您希望清理所有未被任何容器使用的镜像,也可以使用-a标志:

abhisheknair@yaoweibin:~$ docker image prune -a
警告!这将删除所有没有至少一个关联容器的镜像。
您确定要继续吗?[y/N] y
已删除镜像:
未标记:mariadb:latest
未标记:mariadb@sha256:3b6f9fa1d406e168998d62501b2ee4f27d53138bebfcdac03540758996c5ff1d
已删除:sha256:fd17f57768027456cc17987058474fb21d3c51e9dd764e4497c1dfe92ff058db
已删除:sha256:a638f04e531b032c81a84bda59a36d1df3c4cec62560c403bc2edb642bce79ba
已删除:sha256:af7a7e7bf72e7ad0c5227995f219d9094fafbe0ac973dbe7eb4ab190a5a58ba5
已删除:sha256:a0cfd81b291e8da6bca0731c9db70fe1b61d176906b1cf05ade1cd61572ffaaa
已删除:sha256:38b00cb5dab64398092fab2b18563af1ef4a9445dec8a531ac725059dc218f41
已删除:sha256:6e60d29d2d76125f989f503a78729984f7ba3e26bfbf7038d5ab644b8755b7c2
已删除:sha256:1dafdd60e471b4c1f5244cfe1d20d79f934f504ef42180b637886be2b0b74370
已删除:sha256:2fffe8e736cdb99359084e297f4bb54a4cac879366bd3e4333d3dbe966f8e9a6
已删除:sha256:f728037697805db453111266541c202c74971484ef359ea29b9c60064ed9e47e
已删除:sha256:28155a13db3520201db576bf6d56b68fc08ef27b1c4c49dbfeadef523d35c5f0
已删除:sha256:7555a8182c42c7737a384cfe03a3c7329f646a3bf389c4bcd75379fc85e6c144
未标记:redis:latest
未标记:redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59
已删除:sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7
已删除:sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2
已删除:sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9
已删除:sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e
已删除:sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d
已删除:sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68

总共回收的空间:445.2MB
abhisheknair@yaoweibin:~$

您还可以使用--force-f标志继续进行清除而无需确认,或使用--filter标志为prune命令提供过滤器值(例如'until=')。

示例:

$ docker image prune -a --force --filter "until=2021-01-04T00:00:00"

或者

$ docker image prune --filter="label=deprecated"

使用rmi命令

您还可以使用Docker的rmi命令删除镜像。

它从Docker节点中删除(并取消标记)一个或多个镜像。如果一个镜像有多个标签,使用带有标签作为参数的此命令仅删除标签。如果该标签是该镜像的唯一标签,则同时删除镜像和标签。

此命令不会从注册表中删除镜像。此外,除非使用-f选项(与docker image rm命令相同),否则无法删除正在运行的容器的镜像。

示例:

abhisheknair@yaoweibin:~$ docker rmi alpine
未标记:alpine:latest
未标记:alpine@sha256:adab3844f497ab9171f070d4cae4114b5aec565ac772e2f2579405b78be67c96
已删除:sha256:d4ff818577bc193b309b355b02ebc9220427090057b54a59e73b79bdfe139b83
已删除:sha256:72e830a4dff5f0d5225cdc0a320e85ab1ce06ea5673acfe8d83a7645cbd0e9cf
abhisheknair@yaoweibin:~$

您还可以使用--no-prune来指定不删除未标记的父镜像。

停止容器并删除镜像

在许多情况下,您可能需要停止所有容器并删除所有关联的镜像。您可以通过以下命令简单完成:

$ docker rm -vf $(docker ps -a -q)

上述命令将强制停止并删除所有正在运行的容器。然后,我们可以继续使用以下命令删除关联的镜像:

$ docker rmi -f $(docker images -a -q)

总结

Docker是一种多功能工具,是当今DevOps工程师必备的一部分,也是其他热门技术(如Kubernetes)的一部分。Docker镜像管理是管理和故障排除Docker部署的重要组成部分。

现在你应该对docker CLI(command)提供的命令(如imageimagesrmi)的功能有一个基本的了解。它们的标志提供进一步的定制和高级过滤和定制选项,可以帮助自动化和高级使用。

使用docker [COMMAND] help获取有关可用选项和相关帮助主题的详细信息。

类似文章