停止并删除所有Docker容器。

203

我该如何停止并删除所有 Docker 容器,以便在 Docker 中创建全新的环境?很多时候,我觉得从头开始更容易,但我的许多容器状态我都不确定,当我运行 docker rm 时,它会提示拒绝访问,因为 Docker 容器可能仍在使用中。


可能是如何删除旧的Docker容器的重复问题。 - DarkCygnus
是的,我不确定是否重复了。你发布的那个问题是关于删除旧容器的,而我想知道的是如何删除所有内容,无论多久以前。但是肯定有重叠部分。 - jjbskir
该问题链接确实要求使用旧容器,但解决方案适用于您指定的任何容器。因此,您可以将那个其他解决方案调整为您的情况。 - DarkCygnus
13个回答

378

停止所有容器

docker stop $(docker ps -a -q)

移除所有容器

docker rm $(docker ps -a -q)

在这里查找更多命令


18
未知的速记标志:在-a中的 'a'。 - Akmal Salikhov
终于!有人提供了一个在Windows上能够正常运行的命令!
注意:我是在Git Bash中运行这些命令的!
- John
-a = 大多数情况下都是全部.. - mercury
2
在第一个命令中,您不需要-a标志。docker ps 仅会列出正在运行的容器。 - meni181818
1
我建议使用 xargs 来处理这两个命令,因为如果 docker ps -a -q 列出的容器为空,运行任何一个命令都会失败,因为你没有给它任何参数。而使用 xargs 将不会调用该命令。 - Hakanai

88

Docker引入了新的命名空间和命令,每个人都应该学习并不再坚持旧的习惯。这是文档,这里有一些示例:

删除不再需要的容器(已停止)

docker container prune

删除不再需要的图片

这意味着,它仅删除未标记且没有被“latest”指向的图像 - 因此不会删除您通常可以使用的真实图像。

docker image prune

删除所有未被任何现有容器使用的卷

(即使已停止的容器也会声明卷)。这通常会清理掉很久以前已删除的容器的悬空匿名卷。它不应该删除命名卷,因为这些卷所属的容器应该存在/正在运行。 请注意,在执行此操作之前,请确保您的堆栈至少正在运行。

docker volume prune

未使用的网络同样适用

docker network prune

最后,如果您想清除所有垃圾 - 确保生产不受任何影响,请确保所有的堆栈都在运行,然后运行

docker system prune

2
docker system prun towards last is missing an e - Ayushya
3
在我看来,“docker system prune”才是这个问题的真正答案。 - ndm13
2
虽然这很有用,但是这些命令都不能停止所有正在运行的容器,只能清理已经停止的容器留下的东西。因此,首先您仍然需要坚持“旧习惯”,并执行 docker stop $(docker ps -q) 以优雅地停止它们,或者如果有一些不想停止的“叛逆”容器,则执行 docker kill $(docker ps -q) - Mariano Ruiz

20
docker ps -aq | xargs docker stop | xargs docker rm

或者

docker ps -aq | xargs docker rm -f

docker ps -aq

  1. docker ps -adocker ps --all返回所有容器,而不仅仅是正在运行的容器
  2. docker ps -qdocker ps --quiet返回容器ID

docker rm -fdocker rm --force也会删除正在运行的容器


3
请提供您所提到的Docker命令的简要详细信息,这对于学生和初级开发人员来说尤其有帮助。详细信息总是有益的。 - Muhammad Tariq
这个命令可以杀死所有进程。对于那些匆忙的人来说非常方便。 - Elias Prado
请注意,如果没有容器,例如在新实例上运行部署脚本会引发错误。需要添加一个检查。 - alphazwest
2
为了避免docker ps -aq返回空时出现错误,可以像下面这样添加-r来停止容器: docker ps -aq | xargs -r docker stop - Gloorfindel

16

一个命令行清理所有容器

docker system prune -f ; docker volume prune -f ;docker rm -f -v $(docker ps -q -a)

8

简单来说:

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

如果你只想运行一次,那么删除 -a

7
我们可以通过一行命令实现此操作(同时删除正在运行的容器)。
docker container rm $(docker container ls -aq) -f

它是做什么的

docker container ls -aq 仅列出容器ID

docker container rm $(..) -f 强制删除所有容器ID


6
这是我在处理这类问题时使用的一个好的要点: 从似乎不受欢迎的链接中获取信息 (https://gist.github.com/bastman/5b57ddb3c11942094f8d0a97d461b430) 删除卷。
$ docker volume rm $(docker volume ls -qf dangling=true)
$ docker volume ls -qf dangling=true | xargs -r docker volume rm

删除网络

$ docker network ls  
$ docker network ls | grep "bridge"   
$ docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

删除Docker镜像

// 参考: https://dev59.com/NlwY5IYBdhLWcg3wWWq0

$ docker images
$ docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
$ docker images | grep "none"
$ docker rmi $(docker images | grep "none" | awk '/ / { print $3 }')

删除 docker 容器

// 参考: https://dev59.com/NlwY5IYBdhLWcg3wWWq0

$ docker ps
$ docker ps -a
$ docker rm $(docker ps -qa --no-trunc --filter "status=exited")

您希望停用正在运行的所有容器,删除每个镜像,卸载Docker,重新安装所需版本,那么这应该是最干净的状态了。


1
你能否贴出命令而不是只提供gist的链接?这将极大地帮助那些无法访问链接但想从你的答案中受益的用户。此外,有一天该链接可能会失效,使得你的答案变得不太有用。 - DarkCygnus
谢谢,已删除我的DV。 - DarkCygnus
1
一切都很好。只是想回馈社区,我以前从未回答过这些问题。我猜所有的开发人员在某个时候都会有这种感觉吧? - Chris
这太棒了,@Chris帮助他人真的很荣耀,同时也是巩固自己在该主题上知识的好机会,因为写答案有时会让你更深入地学习该主题或澄清你曾经有过的一些疑惑。只要记住你的答案应该清晰,并考虑像这样的方面,这些都是SO中良好答案所必需的。 - DarkCygnus
因为过时了,所以被大量地踩了。没有必要使用 filter dangling=true 了,现在有 prune。 - Eugen Mayer

6

停止容器:

docker stop container1_id container2_id containerz_id 

删除所有图片:

docker system prune --all

4
如果您担心shellcheck SC2046(在这种情况下,您会收到有关命令docker stop $(docker ps -a -q)的警告),并且您正在使用Bash4+(以便能够使用mapfile内置命令),则可以运行以下命令停止所有容器:
mapfile -t list < <(docker ps -q)
[[ ${#list[@]} -gt 0 ]] && docker container stop "${list[@]}"
推理:
  • docker ps -q 返回所有活动容器的ID

  • mapfile 将结果容器ID存储在 list 数组中

  • [[ ${#list[@]} -gt 0 ]] 检查 list 数组是否有1个或多个元素来执行下一个命令

  • docker container stop "${list[@]}" 停止所有已在 list 数组中存储其ID的容器(仅在数组有项目时运行)

同样地,要删除所有已停止的容器:

mapfile -t list < <(docker ps -aq)
[[ ${#list[@]} -gt 0 ]] && docker container rm "${list[@]}"

(docker ps -aq会返回所有容器的ID,即使是已停止的容器)

如果您想停止并删除所有容器,可以按顺序运行上述命令(先stop,然后再rm)。

或者,您可以只运行使用rm --force来删除容器的命令,但请注意,这将发送SIGKILL,因此建议先运行stop,然后再运行rmstop会发送SIGTERM,除非它超时,否则会发送SIGKILL)。


这是为了适应容器名称中包含空格的情况吗? - kjones
1
如果您使用shellcheck,由于“当命令扩展未加引号时,会发生单词拆分和通配符”,因此会收到未引用$()的警告。在docker容器ID的情况下,没有这样的问题,因此您可以禁用该规则,但是如果您不想禁用该规则,则可以使用我发布的替代方法。它做同样的事情,尽管有更多的代码,所以您可能更喜欢只使用docker stop $(docker ps -a -q),但是如果有替代方案,即使我知道在这种特定情况下没有问题,我也会尝试避免未转义的引号。 - Lucas Basquerotto
我明白了,谢谢你的跟进解释。 - kjones

1

删除所有 Docker 镜像:

docker rmi $(docker images -aq)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接