如何清理Docker镜像、容器及数据卷
作者 Melissa Anderson
导语
Docker给用户提供了容器,用户可以简单地将软件与系统打包至容器中,从而保证它们可以在任何地方运行。但是,当使用Docker时,很容易积累大量不用的镜像、容器与数据卷,它们占用了磁盘空间,还使输出变得混乱。
Docker也提供了一切通过命令行清理系统的所需的工具。这篇公式集式的指南旨在提供一些清理Docker镜像、容器与数据卷的指令供快速参考,从而帮助读者清理磁盘并保持系统井井有条。
如何使用这篇指南:
- 这篇指南如同一个公式集,给出了单独的命令行片段。
- 根据你的需求直接参阅相关部分。
清理所有虚悬镜像(Dangling Image)、没有用过的容器、数据卷及网络
Docker提供了一条可以清除任何虚悬(dangling)资源的命令行,无论是镜像、容器、数据卷还是网络。虚悬指未被标记或是不与其它任何容器相关。
$ docker system prune
如果需要进一步清理所有已停止的容器及未被使用的镜像(不只是虚悬镜像),在命令行后添加一个-a标记。
清理Docker镜像
清除一个或多个指定镜像
使用docker images
命令行,并在其后添加一个-a
标记,即可找到需清除镜像的ID。这个命令会显示所有的镜像,其中也包含了中间层镜像。找到需删除的镜像后,可将它们的ID标记在命令docker rmi
后。
读取列表:
$ docker images -a
清理:
$ docker rmi ImageID ImageID
清理虚悬镜像
Docker镜像由许多层构成。虚悬镜像指的是与其它被标记的镜像没有任何关系的层。这些层不再有任何用途,只是占用磁盘空间。通过在docker images
命令后加过滤标记-f
与dangling=true
,可以定位虚悬镜像。如果确定要删除它们,可以用docker image prune
指令。
注:当创建了一个镜像却没有标记它时,这个镜像就会被认定为虚悬镜像,因为它不与任何标记过镜像有关联。为避免这种情况,可以在创建镜像时使用docker tag
命令标记它。
读取列表:
$ docker images -f dangling=true
清理:
$ docker image prune
依照模板清理镜像
使用命令docker images
与grep
可以找到所有符合某个模板的镜像。找到全部所需镜像后,用命令awk
可以将它们的ID传至docker rmi
后,借此完成清理。请注意,Docker并不支持这些功能,而且在某些系统中可能无法使用。
读取列表:
$ docker images -a | grep "pattern"
清理:
$ docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
清除所有镜像
使用命令docker images
后加-a
即可获取系统中所有Docker镜像的列表。如果需要删除全部镜像,可以使用-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
退出容器的同时将其清除
如果在创建容器时确定在使用过后就不需要它了,可以运行命令docker run --rm
,这样在退出容器后它就会被自动删除。
运行并清理:
$ docker run --rm image_name
清理所有已退出容器
通过指令docker ps -a
可以获取所有容器,并可按照它们的状态,created
,restarting
,running
,paused
或者exited
,将它们分类。使用标记-f
即可完成分类,而且可以单独查看exied
状态的容器。确定了需清理的容器后,用-q
将它们的ID传至docker rm
后即可。
读取列表:
$ docker ps -a -f status=exited
清理:
$ docker rm $(docker ps -a -f status=exited -q)
依照模板清理容器
使用命令docker ps
与grep
可以找到所有符合某个模板的容器。得到全部需清理容器的列表后,用命令awk
与xargs
可以将它们的ID传给docker rm
。请注意,Docker并不支持这些功能,而且在某些系统中可能无法使用。
读取列表:
$ docker ps -a | grep "pattern”
清理:
$ docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
停止并清除所有容器
通过使用命令docker ps
可以查看系统中的容器。在其后添加一个-a
后缀可以显示所有容器。如果确认需要删除全部容器,可以通过添加-q
标记将容器ID传给命令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 volume_name
清理虚悬数据卷 - Docker 1.9及以上
因为数据卷的意义在于独立于容器之外,所以即使清除了一个容器,它对应的数据卷并不会同时被自动清除。当数据卷不再与任何容器相连时,它就是虚悬数据卷(dangling volume)。用命令docker volume ls
并把限定条件定为虚悬数据卷,就可以找到并确认清理它们。得到全部需要清除的数据卷列表后,可以用docker volume prune
清理全部。
读取列表:
$ docker volume ls -f dangling=true
清理:
$ docker volume prune
清理容器及其数据卷
创建了一个未命名数据卷(unnamed volume)后,可以在删除对应容器时加一个-v
标记,这样就可以同时清除这个数据卷。需注意的是,这个方法只对未命名数据卷有效。成功清除容器后,容器ID会被列出,但不会展示相关数据库是否被清除。如果是未命名数据库,会被自动删除;如果是命名了的数据库,则默认不受影响。
清理:
$ docker rm -v container_name
结论
本指南介绍了一些常用的用Docker清理镜像、容器及数据卷的指令。这些指令也可以和更多标记相结合,详见Docker的docker system prune,docker rmi,docker rm及docker volume rm文档。