Docker是软件容器化技术,帮助开发者在从桌面到云的不同平台上创建和部署应用程序。
在Docker容器中构建应用程序所需的源代码、依赖关系和工具的快照–或蓝图,被称为镜像。需要持久性数据的Docker应用程序可以依赖独立于底层操作系统的存储,称为卷。
在使用Docker时,有效组织镜像、卷和容器是很重要的。这些资产的未使用的化身会累积起来,占用宝贵的磁盘空间,最终影响系统性能。
本文探讨了通过删除镜像、卷和容器来维护系统组织的不同方法。而且我们将使用 docker
命令行界面(CLI)来快速完成这些任务。
如何删除Docker镜像
从Docker中删除过期或不必要的镜像对于保持系统的整洁和有序至关重要。让我们来看看CLI如何针对某些镜像进行删除。
首先,让我们用 docker image ls
命令来看看Docker环境中的镜像:
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my_image latest 2cbc27836df4 60 seconds ago 7.05MB <none> <none> 85b412789704 2 days ago 7.05MB demo latest 26d80cd96d69 15 months ago 28.5MB
上面列出的镜像显示了名为my_image和demo的镜像,都被标记为latest。第三个镜像没有名称或标签。在这种情况下,它是一个 “dangling” 的镜像:一个目前没有被容器使用的镜像。这个悬空的镜像是由my_image的重建造成的(一种常见的情况)。先前版本的映像仍然在文件系统中,但现在没有被使用。
该列表还显示了每个镜像的64个字符的ID的前12个字符,创建日期,以及镜像所消耗的存储空间。
删除所有未使用的镜像
在上面的列表例子中,我们有一个dangling镜像。然而,一个没有名字或标签的镜像有可能是活动的。例如,它可以通过引用其ID来启动一个容器。
为了安全地删除所有真正dangling镜像,你可以使用 docker image prune
命令:
$ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y Deleted Images: deleted: sha256:85b412789704c17e9c5e7edc97b2f64c748bbdae7eaa44d3fe2cc21a87acad3d Total reclaimed space: 7.05MB
我们再列出我们的镜像,看看执行命令后的效果:
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE my_image latest 2cbc27836df4 70 seconds ago 7.05MB demo latest 26d80cd96d69 15 months ago 28.5MB
在修剪过程中,没有名字或标签的镜像已经消失了。
按名称删除特定镜像
你可以通过引用一个镜像的名称来锁定该镜像进行删除:
$ docker image rm <image_name>
注意:你不能轻易地删除仍在使用的镜像。你应该停止或删除正在使用镜像的运行中的容器。虽然通常不推荐这样做,但你可以使用 -f
标志强制删除一个活动的镜像:
$ docker image rm <image_name> -f
使用rmi速记来删除镜像
Docker CLI在别名 rmi
中有一个删除镜像的速记方法。使用它来删除一个镜像的名字,看起来像这样:
$ docker rmi demo Untagged: demo:latest Deleted: sha256:2cbc27836df4a7707e746e28368f1fdecfefbfb813aae06611ca6913116b80b4
我们将使用 rmi
来完成下面的镜像清除例子。
删除所有未标记的镜像
没有标记的镜像仍然占据着宝贵的磁盘空间,随着时间的推移,会使你的系统越来越慢。
要消除Docker中所有未标记的镜像,可以使用带有过滤器的 docker rmi
命令。你可以使用 -f
选项提供基于特定标准的过滤器(不要与 image rm
可用的 -f
标志相混淆,以强制采取行动)。
过滤器 dangling=true
用于识别未标记的镜像:
$ docker rmi $(docker images -f "dangling=true" -q)
上述命令中的 -q
选项显示了所有未标记的镜像的ID。然后将所有这些ID作为参数传递给 docker rmi
,以便将其删除。
这个过滤器使用关键字 “dangling”,但如上所述,一些没有标签的镜像实际上可能是活动的。如果被这个过滤器选中的镜像不是真正的悬空,你会被警告的。
按ID删除特定镜像
你可以使用 docker rmi
命令,通过引用其ID来删除任何特定的镜像:
$ docker rmi <image_id>
按名称和标签删除特定镜像
你可以通过使用 docker rmi
命令来删除一个特定的镜像以及它的名字和标签。
例如,如果你有多个具有相同名称但不同标签的镜像,你可以通过使用这种格式来删除一个特定的镜像:
$ docker rmi <image_name>:<tag>
当你想删除一个特定版本的镜像,而不是删除与一个资源库相关的所有镜像时,这种方法很方便。
移除所有带有latest标签的镜像
在Docker中,”latest” 标签指的是某个Docker镜像的最新版本。最新标签通常被用作Docker镜像的默认标签。它被自动分配给镜像的最新构建,除非明确指定另一个标签。
Docker提供了一个命令来删除所有带有 “latest” 标签的镜像:
$ docker rmi $(docker images | grep "latest" | awk '{print $3}')
上述命令分为两部分。首先,它得到了镜像ID的列表,然后将这个列表作为参数传递给 docker rmi
命令。
从远程存储库中删除镜像
要从远程仓库(如Docker Hub)中删除一个镜像,你首先需要使用Docker CLI登录该账户。
一旦你登录了,你只需要使用 docker rmi
命令来删除该镜像。 docker rmi
命令可以同时删除本地和远程镜像:
docker rmi my_repo/my_image_tag
值得注意的是,你只能删除已经推送到存储库的镜像。同样,你也不能删除正在运行的容器所使用的镜像。
从远程版本库中删除多个镜像
要从远程仓库移除多个镜像,你可以使用 docker rmi
命令,后面跟上镜像的ID或标签。比如说:
docker rmi my_repo/image_tag_1 my_repo/image_tag_2 my_repo/image_tag_3
这将从版本库 my_repo
中删除带有 image_tag_1
, image_tag_2
和 image_tag_3
标签的三张镜像。
如何删除Docker卷
Docker卷可能会占用大量的磁盘空间,特别是当它们包含大量的数据或多个备份时。通过删除不再需要的卷,你可以减少数据泄露的风险,确保敏感数据不会被未经授权的用户访问。定期删除卷也可以使Docker环境保持最新,并防止由过时的数据引起的问题。
这些命令会永久地破坏存储在卷中的所有数据,所以要谨慎使用它们。
移除所有未使用的卷
在Docker中,删除未使用的卷与删除镜像或容器一样关键。
为了释放磁盘存储,你可以使用 docker volume prune
命令。
按名称删除一个特定卷
在Docker中删除一个特定的卷,对于删除未使用的卷很有用。下面是删除一个卷的命令。
docker volume rm my_volume_name
通过上述命令,my_volume_name卷将被删除。如果你试图删除一个已使用的卷,Docker会产生一个错误。你可以使用 docker volume ls
命令来检查可用的卷。
如何删除Docker容器
当你更多地使用Docker工作时,你可能会积累许多未使用的容器,这些容器占用了磁盘资源。如果你不删除它们,它们会随着时间的推移积累起来,占用宝贵的磁盘资源,拖慢你的系统,并有可能使你陷入危险。
移除所有停止的容器
命令 docker container prune
可以删除Docker中所有停止的容器。在这里,该命令创建了一个将被删除的所有停止的容器的列表,并在继续进行之前要求确认。这有助于回收磁盘空间,维持一个干净有序的Docker环境,同时允许你仔细检查你没有失去任何重要的东西:
$ docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y Deleted Containers: 4df4c47c4df4 d35bcec20bce
注意,只有停止的容器可以用这个命令来删除。如果你需要删除正在运行的容器,你需要先停止它们或者使用不同的命令。
通过ID删除一个特定的容器
在Docker中,你可以使用 docker rm
命令和容器ID一起按ID删除一个特定的容器。首先,使用 docker ps
命令获得所有的容器ID:
$ docker ps -a -q 1ce3cdeb4035 06b79541e25c fa98f1804e3e $ docker rm 1ce3cdeb4035
上述命令只有在容器处于停止状态时才有效。如果容器正在运行,那么你需要使用-f标志强行删除它:
$ docker rm -f 1ce3cdeb4035
按名称删除一个特定的容器
Docker提供了一个多用途的 docker rm
命令,可以按名称和ID删除容器。
例如,如果你有一个名为web_server的容器,你可以用下面的命令来删除它:
$ docker rm web_server
首先,停止容器是很重要的。Docker提供了 docker stop
命令来停止一个特定的容器。
移除所有运行中的容器
要删除所有正在运行的容器,你可以使用 docker rm
命令:
$ docker rm $(docker ps -q)
使用 docker ps -q
可以列出运行中的容器的ID。之后,ID被传递给 docker rm
命令,该命令会移除所有的容器。
注意,这个命令只会删除正在运行的容器。如果你想删除所有的容器,包括停止的容器,你可以使用下面的命令来代替:
$ docker rm $(docker ps -a -q)
小结
这篇文章解释了如何删除Docker镜像、卷和容器。你学到了各种方法来维护一个干净和有组织的系统。它涵盖了按ID或名称删除所有未使用的、未标记的或特定的镜像的命令。你还学习了按ID或名称删除所有停止的容器或特定容器的命令。
删除Docker镜像、卷和容器是一个简单明了的过程,可以帮助你管理未使用的组件,恢复宝贵的磁盘空间,并经常提高系统性能。
评论留言