如何删除旧的Docker容器

这个问题与我应该关心多余的,不运行的Docker容器有关吗?

我想知道如何删除旧的容器。 docker rm 3e552code34a让你删除一个,但我已经有很多。 docker rm --help没有给出select选项(像所有的,或通过图像名称)。

也许有一个目录,这些容器存储在哪里我可以很容易地手动删除它们?

在Docker 1.13.x中有一个名为Docker container prune的新特性: docker docker container prune这将做你想做的事情,并且应该以相同的方式在所有平台上工作。

还有一个Docker系统修剪 ,它将一个命令清理容器,图像,卷和networking。

原始答案:

有一些关于Docker清理命令的讨论。 你可以find这张票的信息: https : //github.com/dotcloud/docker/issues/928

在该命令可用之前,您可以将Docker命令与其他Unix命令一起使用,以获得所需的内容。 这里是一个如何清理旧周岁的容器的例子:

 $ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm 

为了给出信用,这个例子来自https://twitter.com/jpetazzo/status/347431091415703552

另一种方法,我从纪尧姆·J·Charmes(信贷到期)得到:

 docker rm `docker ps --no-trunc -aq` 

将以优雅的方式移除所有容器。

而由Bartosz Bilicki撰写的Windows版本:

 FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i 

对于PowerShell:

 docker rm @(docker ps -aq) 

Docker 1.13(2016年第四季度)的更新,归功于VonC ( 稍后在此主题中 ):

docker system prune将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。

请参阅PR 26108和提交86de7c0 ,这些命令引入了一些新命令来帮助可视化Docker守护程序数据在磁盘上占用多less空间,并允许轻松清除“不需要的”过量。

 docker system prune WARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all images without at least one container associated to them Are you sure you want to continue? [y/N] y 

更新后的答案现在使用docker system prunedocker container prune 。 请参阅VonC更新的答案: https : //stackoverflow.com/a/39860665/411229

以前的答案在上面编写几个不同的提示,删除所有非运行的容器的最优雅的方式似乎是:

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

  • -q只打印容器ID(没有列标题)
  • -f允许您过滤打印的容器列表(在这种情况下,我们正在过滤只显示退出的容器)

官方的方式是:

 docker rm `docker ps -aq` 

Docker维护者已经表示,不会有这样的命令 – 而你编写的命令是这样的:

我们之前已经讨论过这个问题,并且希望用户使用上面的代码,而不必为Docker添加额外的代码。

现在可以使用docker ps进行过滤了:

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

对于图像 :

 docker rmi $(docker images -q -f "dangling=true") 

然而,如果没有匹配的容器,任何一个都会导致docker rm或者docker rmi抛出一个错误。 旧的docker rm $(docker ps -aq)技巧更糟,因为它试图删除任何正在运行的容器,每个容器都失败。

这里有一个更简洁的脚本来添加你的~/.bashrc~/.profile

 # Use `docker-cleanup --dry-run` to see what would be deleted. function docker-cleanup { EXITED=$(docker ps -q -f status=exited) DANGLING=$(docker images -q -f "dangling=true") if [ "$1" == "--dry-run" ]; then echo "==> Would stop containers:" echo $EXITED echo "==> And images:" echo $DANGLING else if [ -n "$EXITED" ]; then docker rm $EXITED else echo "No containers to remove." fi if [ -n "$DANGLING" ]; then docker rmi $DANGLING else echo "No images to remove." fi fi } 

编辑:如下所述,原来的答案是删除图像,而不是容器。 更新了两个答案,包括新的文档链接。 感谢Adrian(和Ryan的回答)提到了新的ps过滤。

随着Docker 1.13(2016年第四季度),你现在有:

docker system prune将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像)。

请参阅PR 26108和提交86de7c0 ,这些命令引入了一些新命令来帮助可视化Docker守护程序数据在磁盘上占用多less空间,并允许轻松清除“不需要的”过量。

 docker system prune WARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all images without at least one container associated to them Are you sure you want to continue? [y/N] y 

正如wjv的评论,

还有docker {container,image,volume,network} prune ,这可以用来删除只有一种types的对象的未使用的实例。

在提交913e5cb中引入 ,仅适用于Docker 1.13+。

 docker container prune 

2017年 更新 (最新)

 docker container prune 

这 – 2017 (OLD)的方式

去除所有停止的容器

 docker rm $(docker ps -a -q) 

要删除所有容器 (已停止和未停止)

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

删除所有停止的容器:

 docker rm $(docker ps -a | grep Exited | awk '{print $1}') 

来自pauk960的评论:

从版本1.3.0开始,您可以使用docker ps而不是grep Exited使用docker ps -a -f status=exited 。 如果你使用-q ,你只能得到容器ID而不是完整的输出,不需要使用awk。

如果不想删除所有容器,则可以使用docker ps --before <container-ID>docker ps --before <container-ID>select在特定容器之前或之后创build的所有容器。 这个function至less在Docker版本0.6.5中。

比方说,你已经开发了你的系统,现在它正在工作,但有一些容器剩下。 您想删除在该工作版本之前创build的容器。 使用docker ps确定工作容器的ID。

删除在其他容器之前创build的容器

 docker rm $(docker ps --before 9c49c11c8d21 -q) 

另一个例子。 您的数据库已经在Docker容器上运行。 你已经开发你的应用程序在其他容器上运行,现在你有一些不需要的容器。

删除在某个容器后创build的容器

 docker rm $(docker ps --since a6ca4661ec7f -q) 

Docker将容器存储在Ubuntu的/var/lib/docker/containers中。 我认为额外的容器不会造成其他伤害,但会占用磁盘空间。

更新:从Docker版本1.13(2017年1月发布)开始,您可以发出以下命令清理已停止的容器,未使用的卷,悬挂的图像和未使用的networking:

 docker system prune 

如果您要确保只删除具有exited状态的容器,请使用以下命令:

 docker ps -aq -f status=exited | xargs docker rm 

同样,如果你正在清理docker的东西,你可以通过这种方式去除未标记的,未命名的图像:

 docker images -q --no-trunc -f dangling=true | xargs docker rmi 

这是我的docker清理脚本,它删除未标记的容器和图像。 请检查来源的任何更新。

 #!/bin/sh # Cleanup docker files: untagged containers and images. # # Use `docker-cleanup -n` for a dry run to see what would be deleted. untagged_containers() { # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1. docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}' } untagged_images() { # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3. # NOTE: intermediate images (via -a) seem to only cause # "Error: Conflict, foobarid wasn't deleted" messages. # Might be useful sometimes when Docker messed things up?! # docker images -a | awk '$1 == "<none>" {print $'$1'}' docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}' } # Dry-run. if [ "$1" = "-n" ]; then echo "=== Containers with uncommitted images: ===" untagged_containers 0 echo echo "=== Uncommitted images: ===" untagged_images 0 exit fi # Remove containers with untagged images. echo "Removing containers:" >&2 untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true # Remove untagged images echo "Removing images:" >&2 untagged_images 3 | xargs --no-run-if-empty docker rmi 

来源: https : //github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

首先,在尝试删除容器之前停止运行容器

删除运行的容器

 docker rm $(docker stop -t=1 $(docker ps -q)) 

你可以使用kill而不是stop 。 在我的情况下,我宁愿stop因为我倾向于重新运行它们,每次创build一个新的,所以我试图很好地closures它们。

注意:试图阻止一个容器会给你一个错误:

错误:不可能删除正在运行的容器,请先停下来

删除所有容器

 docker rm $(docker ps -a -q) 

从Windowsshell删除所有容器:

 FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i 

https://github.com/HardySimpson/docker-cleanup

Docker清理

一个小巧的一体式shell,可以去除:

  • 一天前运行的容器
  • 不属于任何剩余容器的图像

打算作为crontab作业运行

特征

  • 它将删除所有的<none>:<none>图像
  • 如果图像具有多个repo:标签引用,它将除去运行容器除去所有repo:标签。 其实这是“dockerrmi”的性质。
  • 很多错误信息会显示在屏幕上,你可以决定2>/dev/null或不
  • 从docker-gc学习一些东西,并解决它的问题(它不能删除具有多个repo:标签的图像)

使用:

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

它强制停止并删除当地存在的所有容器。

所以,我个人build议把它作为你的部署脚本的一部分来保存图像和容​​器,只保留最新的n个容器和图像。 我使用与git tag相同的版本模式来标记我的docker图像,并始终使用“latest”标记最新的docker图像。 这意味着,如果没有清理任何东西,我的docker图像看起来像:

 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE some_repo/some_image 0.0.5 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image latest 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image 0.0.4 0beabfa514ea 45 hours ago 925.4 MB some_repo/some_image 0.0.3 54302cd10bf2 6 days ago 978.5 MB some_repo/some_image 0.0.2 0078b30f3d9a 7 days ago 978.5 MB some_repo/some_image 0.0.1 sdfgdf0f3d9a 8 days ago 938.5 MB 

现在,我当然不想把所有的图像(或容器)都留在我所有的生产箱子上。 我只想要最后3或4回滚,摆脱一切。 Unix的tail是你最好的朋友。 由于docker imagesdocker ps都是按照datesorting的,我们可以使用tail来select除了前3以外的所有图像,并将其删除:

 docker rmi $(docker images -q | tail -n +4) 

通过部署脚本(或本地)运行,始终保持足够的图像,以便在不占用太多空间或与旧图像混淆的情况下轻松回滚。

就我个人而言,我只能随时在我的生产箱上放一个容器,但是如果你想要更多的东西,你可以用容器做同样的事情:

 docker rm $(docker ps -aq | tail -n +4) 

最后,在我简单的例子中,我们一次只能处理一个回购,但如果你有更多的回购,你可以用同样的想法来更复杂一点。 说我只想保留some_repo / some_image的最后3张图片。 我可以混合使用grepawk然后按照我的方式:

 docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4) 

再一次,同样的想法适用于容器,但你明白这一点,所以我会停止给例子。

删除所有停止的容器。

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

这将通过使用docker ps -a -q获取所有容器的列表并将其ID传递给docker rm来移除所有停止的容器。 这不应该删除任何运行的容器,它会告诉你它不能删除正在运行的图像。

删除所有未标记的图像

现在你想清理旧的图像,以节省一些空间。

sudo docker rmi $(sudo docker images -q –filter“dangling = true”)

删除5个最旧的容器:

 docker rm `docker ps -aq | tail -n 5` 

看看剩下多less个容器:

 docker ps -aq | wc -l 

新方法: spotify / docker-gc发挥技巧。

  docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc 
  • 一个多小时前退出的容器被移除。
  • 之后不属于任何剩余容器的图像将被删除

它支持环境设置

强制删除具有多个标签的图像

  FORCE_IMAGE_REMOVAL=1 

强制删除容器

  FORCE_CONTAINER_REMOVAL=1 

从垃圾收集中排除最近退出的容器和图像

  GRACE_PERIOD_SECONDS=86400 

此设置还可以防止删除已创build时间less于GRACE_PERIOD_SECONDS秒的图像。

空运

  DRY_RUN=1 

清理孤立的容器卷 CLEAN_UP_VOLUMES = 1

参考: docker-gc

老办法:

删除旧的,不运行的容器

  docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm OR docker rm $(docker ps -a -q) 

删除与非运行的docker集装箱相关的所有图像

  docker images -q | xargs --no-run-if-empty docker rmi 

清理Docker版本1.10.x及更高版本的孤立的docker卷

  docker volume ls -qf dangling=true | xargs -r docker volume rm 

根据时间段

  docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm 

您可以使用以下命令删除已退出的容器:

 docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1) 

这里是充分的要点也删除docker上的旧图像: 要求删除旧的docker和图像 。

 #!/bin/bash # docker-gc --- Remove stopped docker containers RUNNING=$(docker ps -q) ALL=$(docker ps -a -q) for container in $ALL ; do [[ "$RUNNING" =~ "$container" ]] && continue echo Removing container: $(docker rm $container) done 

我总是使用docker rmi $(docker ps -a -q)来删除所有图像。

docker rmi失败时,您可以删除目录/var/lib/docker/graph

  1. 删除所有docker进程:

     docker rm $(docker ps -a -q) 
  2. 删除特定容器:

     $ docker ps -a (lists all old containers) $ docker rm container-Id 

您只能删除停止的容器。 一开始就停止所有这些

docker stop $(docker ps -a -q)

然后你可以删除

docker rm $(docker ps -a -q)

不用哭就移除所有容器:

 sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f 

对于任何感兴趣的人,我从qkrijger中拿出了这个例子,并把它变成了一个清晰的全部(停止并全部移除)

 docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq` 
 docker rm --force `docker ps -qa` 

删除从某个图像创build的所有容器:

 docker rm $(docker ps -a | awk '/myimage:mytag/{print $1}') 

在Ubuntu 14.04(Trusty Tahr)上:

 $ for CON in `docker ps -qa`; do docker rm $CON ; done 

这只是一个普通的Bash命令,所以它应该适用于每个Bash兼容的terminal。

如果要自动/定期清理已退出的容器,并删除正在运行的容器未使用的图像和卷​​,则可以下载此图像融水/docker清理。

我在生产中使用它,因为我们每天在多个服务器上部署数次,我不想去每个服务器清理(这将是一个痛苦)。

赶紧跑:

 docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest 

它会默认每30分钟运行一次(或者使用DELAY_TIME = 1800选项设置它),并清理退出的容器和图像。

更多细节: https : //github.com/meltwater/docker-cleanup/blob/master/README.md