在长时间运行Docker时,系统中存在大量的镜像。如何一次安全地删除所有未使用的Docker映像以释放存储空间?

另外,我还想删除几个月前拉的图片,这些图片有正确的TAG。

因此,我并不是只要求删除未标记的图像。我正在寻找一种方法来删除一般不使用的图像,其中包括未标记和其他图像,如几个月前拉正确的TAG。


当前回答

要修剪所有的图像和卷以及 Docker系统剪枝-af——volumes

其他回答

到目前为止(Docker版本1.12),我们使用以下命令删除所有正在运行的容器。同样,如果我们想要删除卷,我们可以在下面的命令中使用相应的标记-v手动删除卷。

删除所有退出的容器

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

删除所有停止的容器

docker rm $(docker ps -a -q)

删除所有运行和停止的容器

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

删除所有容器,没有任何标准

docker container rm $(docker container ps -aq)

但是,在1.13及以上版本中,为了完整的系统和清理,我们可以直接使用以下命令:

docker system prune

所有未使用的容器、映像、网络和卷都将被删除。我们也可以使用以下命令来清理单个组件:

docker container prune
docker image prune
docker network prune
docker volume prune

第二次更新(2017-07-08)

参考(再次)VonC,使用更近期的系统修剪。不耐烦的人可以使用-f,——force选项跳过提示符:

docker system prune -f

没有耐心和鲁莽的人还可以使用-a,——all选项删除“未使用的图像,而不仅仅是悬垂的图像”:

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

更新

参考VonC的答案,它使用了最近添加的修剪命令。下面是对应的shell别名方便:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

旧的答案

删除停止(退出)的容器:

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

删除未使用的(悬空的)图像:

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

如果您对不可撤销的数据丢失非常谨慎,那么您可以删除未使用的(悬空)卷(v1.9及以上版本):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

下面是一个方便的shell别名:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

参考文献

Docker ps -f 码头工人rm Docker images -f 码头工人rmi Docker v1.9.0版本说明 Docker卷ls Docker卷rm

如果你有很多这样的图像,移除它们可能真的很乏味,但幸运的是Docker有几个命令可以帮助我们消除悬浮图像。在旧版本的Docker中(这在今天仍然有效),你可以通过运行Docker rmi -f $(Docker images -f " hanging =true" -q)来删除悬浮图像。

下面的命令将帮助从本地存储库中删除所有未使用的和旧的映像 ==> docker系统剪枝——全部

根据文档,下面的命令将删除超过48小时的图像。

$ docker image prune --all --filter until=48h