Skip to main content

如何清理Docker镜像、容器及数据卷

作者 Melissa Anderson

导语

Docker给用户提供了容器,用户可以简单地将软件与系统打包至容器中,从而保证它们可以在任何地方运行。但是,当使用Docker时,很容易积累大量不用的镜像、容器与数据卷,它们占用了磁盘空间,还使输出变得混乱。

Docker也提供了一切通过命令行清理系统的所需的工具。这篇公式集式的指南旨在提供一些清理Docker镜像、容器与数据卷的指令供快速参考,从而帮助读者清理磁盘并保持系统井井有条。

如何使用这篇指南:

  1. 这篇指南如同一个公式集,给出了单独的命令行片段。
  2. 根据你的需求直接参阅相关部分。

清理所有虚悬镜像(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命令后加过滤标记-fdangling=true,可以定位虚悬镜像。如果确定要删除它们,可以用docker image prune指令。

注:当创建了一个镜像却没有标记它时,这个镜像就会被认定为虚悬镜像,因为它不与任何标记过镜像有关联。为避免这种情况,可以在创建镜像时使用docker tag命令标记它。

读取列表:

$ docker images -f dangling=true

清理:

$ docker image prune

依照模板清理镜像

使用命令docker imagesgrep可以找到所有符合某个模板的镜像。找到全部所需镜像后,用命令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可以获取所有容器,并可按照它们的状态,createdrestartingrunningpaused或者exited,将它们分类。使用标记-f即可完成分类,而且可以单独查看exied状态的容器。确定了需清理的容器后,用-q将它们的ID传至docker rm后即可。

读取列表:

$ docker ps -a -f status=exited

清理:

$ docker rm $(docker ps -a -f status=exited -q)

依照模板清理容器

使用命令docker psgrep可以找到所有符合某个模板的容器。得到全部需清理容器的列表后,用命令awkxargs可以将它们的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 stopdocker 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文档。