前言
Docker 类似于虚拟机,它可以轻松安装应用程序和关联包,因此我们可以在任何地方运行它。但当我们使用 Docker 时,也很容易累积过多的无用镜像,容器和卷。他们非常占用空间和资源。
Docker 有针对此种问题的删除命令和工具。本教程就是 Docker 删除命令的参考指南。我们会在本教程里教大家如何安全且有条理清理 Docker。
如何使用本指南:
- 本指南采用命令对应实例的方式讲解。
- 大家可以使用 Ctrl+F 搜索跳至需要使用的删除功能并查询对应的命令。
清除所有未使用或未挂载的镜像,容器,卷和网络配置
Docker 提供了一个命令,该命令将清除未挂载(不与容器关联)的所有资源(镜像,容器,卷和网络):
docker system prune
返回内容:
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]
要另外删除所有停止的容器和所有未使用的镜像(不仅仅是未挂在的镜像),添加命令参数-a
:
docker system prune -a
删除 Docker 镜像
删除一个或多个指定镜像
docker images -a
,可以找到所有的镜像 ID。在列表中找到我们打算删除的镜像,复制它的ID或者名称,然后使用docker rmi+ID/名称
来删除指定镜像。
查看列表:
docker images -a
执行删除:
docker rmi Image Image
注意:如果一个镜像是另一个镜像的引用镜像,它是无法被删除的。
例如:adafef2e596e
是 7896ef8f403f
的引用镜像,adafef2e596e
无法被直接删除。
REPOSITORY TAG IMAGE ID CREATED SIZE
kalasearch/ubuntu-nodejs latest 07bb1f0fbf36 2 hours ago 163MB
ubuntu latest adafef2e596e 4 days ago 73.9MB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
Error response from daemon: conflict: unable to remove repository reference "ubuntu" (must force) - container 7896ef8f403f is using its referenced image adafef2e596e
删除虚悬镜像(dangling image
)
Docker 镜像由多层组成。有些镜像被命名为 <none>
,这些镜像是被新镜像覆盖后,老版本镜像会变成 <none>
。这些镜像被称之为虚悬镜像。这些镜像已经没有任何用处且占用磁盘空间。我们可以通过在命令中添加参数-f 来定位它们。确定要删除它们时,可以使用以下命令:dangling=truedocker imagesdocker images purge
注意: 如果你创建的镜像没有tag
,那么这个镜像也会出现在虚悬镜像列表中。要避免这种情况发生,我们可以在创建镜像时,给他们添加上 tag ,之后也可以通过 docker tag
来查找这些镜像
查看列表:
docker images -f dangling=true
执行删除:
docker images purge
根据模式删除镜像
我们可以通过grep
来按需查找到我们需要删除的镜像文件,可以查找某一类属性的镜像文件。然后我们可以通过使用awk将ID传递给docker rmi
来删除它们。具体可以看接下来的实例。
查看列表:
docker images -a | grep "pattern"
执行删除:
docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
实例:
docker images -a
输出结果为:
REPOSITORY TAG IMAGE ID CREATED SIZE
kalasearch/ubuntu-nodejs latest 07bb1f0fbf36 24 hours ago 163MB
ubuntu latest adafef2e596e 5 days ago 73.9MB
hello-world latest bf756fb1ae65 6 months ago 13.3kB
在docker images
查询命令后添加grep
:
docker images -a | grep "bf756fb1ae65"
输出结果为:
hello-world latest bf756fb1ae65 6 months ago 13.3kB
删除此镜像:
docker images -a | grep "bf756fb1ae65" | awk '{print $3}' | xargs docker rmi
执行结果:
Untagged: hello-world:latest
Untagged: hello-world@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
删除所有镜像
我们用docker images -a
命令来查看所有镜像。确定要全部删除后,我们添加参数-q
把需要删除的镜像ID传给docker rmi
查看列表:
docker images -a
执行删除:
docker rmi $(docker images -a -q)
删除容器
删除一个或多个指定容器
使用docker ps -a
命令来查找要删除的容器名或ID:
查看列表:
docker ps -a
执行删除:
docker rm ID_or_Name ID_or_Name
退出时删除容器
如果我们在创建容器时就知道用完后不用保留这个容器,那么我们可以在运行这个容器时,添加参数rm
。docker run --rm
,这样在执行完成时,此容器会被自动删除。
运行并删除:
docker run --rm image_name
删除所有退出的容器
我们可以通过docker ps -a
轻松查找并通过容器当前状态进行筛选:创建、重启、运行、暂停、退出。如果我们要查看已退出的容器列表,我们可以添加参数-f
来查看,删除时用-q
传递给删除命令docker rm
查看列表:
docker ps -a -f status=exited
执行删除:
docker rm $(docker ps -a -f status=exited -q)
使用多个过滤器筛选出指定容器
我们可以通过 Docker ps
的参数赋值来进行“或”的查询和删除。只要满足任意条件,删除命令即会把它们删除掉。例如,我们想要删除容器被标记为 Created
(使用无效命令运行容器时,可能导致的状态)或者 Exited
的容器,我们则可以使用两个过滤器:
查看列表:
docker ps -a -f status=exited -f status=created
执行删除:
docker rm $(docker ps -a -f status=exited -f status=created -q)
根据模式删除容器
我们可以通过grep
来按需查找到我们需要删除的容器,可以查找某一类属性的容器。然后我们可以通过使用awk
将ID传递给docker rmi
来删除它们。
查看列表:
docker ps -a | grep "pattern”
执行删除:
docker ps -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
停止并删除所有容器
我们可以使用docker ps -a
命令来查看所有容器。确定要删除这个列表中的全部容器后,我们在命令结尾添加参数-q
然后传给docker stop
和 docker rm
命令即可
查看列表:
docker ps -a
删除命令:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
删除卷
删除一个或多个指定的卷- Docker 1.9及更高版本可用
使用docker volume ls
命令找到要删除的卷名。然后,我们可以用docker volume rm
命令删除一个或多个卷:
查看列表:
docker volume ls
执行删除:
docker volume rm volume_name
删除虚悬卷(dangling volumes) - Docker 1.9及更高版本可用
由于卷的位置要独立于容器而存在,因此在删除容器时,不会同时自动删除卷。当一个卷存在并且不再连接到任何容器时,称为虚悬卷(dangling volumes) ****。要找到它们并删除可以用docker volume ls
命令加上过滤器即可。确定列表中都是想要删除的卷后,我们可以使用docker volume prune
命令将它们全部删除:
查询列表:
docker volume ls -f dangling=true
执行删除:
docker volume prune
移除容器及对应的卷
我们可以使用docker rm -v
来删除指定容器并同时删除为此容器分配的卷。在执行删除命令后,当容器已经成功删除时,会显示此容器的 ID。另外要注意的是,此命令只会删除容器,和此容器对应的未命名卷。如果卷被命名了,它不会被此命令删除,仍然会保留在系统中。
执行删除:
docker rm -v container_name
总结
本指南介绍了 Docker 中删除镜像、容器及卷的常用命令。其实每个命令还可以有很多组合,更多信息大家可以参考 Docker 官方文档 docker system prune
,docker rmi
,docker rm
、 docker volume rm
。如果大家还有什么不明白的地方,欢迎在留言区留言,我们会根据大家的问题,继续来丰富 Docker 指南。