这个问题与Should I be concerned about excess, non-running, Docker containers?有关 .
我想知道如何删除旧容器 . docker rm 3e552code34a
允许你删除一个,但我已经有很多 . docker rm --help
未提供选择选项(如全部或图像名称) .
也许有一个存储这些容器的目录,我可以手动轻松删除它们?
这个问题与Should I be concerned about excess, non-running, Docker containers?有关 .
我想知道如何删除旧容器 . docker rm 3e552code34a
允许你删除一个,但我已经有很多 . docker rm --help
未提供选择选项(如全部或图像名称) .
也许有一个存储这些容器的目录,我可以手动轻松删除它们?
30 回答
我总是使用
docker rmi $(docker ps -a -q)
删除所有图像 .docker rmi
失败时,您可以删除目录/var/lib/docker/graph
.现在可以将filtering与
docker ps
一起使用:对于images:
但是,如果没有匹配的容器,任何这些都会导致
docker rm
或docker rmi
抛出错误 . 较旧的docker rm $(docker ps -aq)
技巧甚至更糟,因为它试图删除任何正在运行的容器,每个都失败了 .这是一个更清晰的脚本,可以添加到
~/.bashrc
或_137777中:编辑:如下所述,原始答案是删除图像,而不是容器 . 更新以回答这两个问题,包括文档的新链接 . 感谢Adrian(和Ryan的回答)提到新的
ps
过滤 .UPDATED 2017 (最新)
这 - 2017 (OLD)方式
删除 ALL STOPPED CONTAINERS
删除 ALL CONTAINERS (STOPPED AND NON STOPPED)
您可以使用以下命令删除已退出的容器:
以下是删除docker上旧图像的完整要点:Gist to remove old Docker containers and images .
Updated Answer 现在使用
docker system prune
或docker container prune
. 见VonC's updated answer .Previous Answer 在上面编写了几个不同的提示,删除所有非运行容器的最优雅方法似乎是:
docker rm $(docker ps -q -f status=exited)
-q
只打印容器ID(没有列 Headers )-f
允许您过滤打印容器列表(在这种情况下,我们过滤只显示已退出的容器)删除5个最旧的容器:
查看剩余的容器数量:
要在不哭的情况下移除所有容器:
对于任何有兴趣的人,我从qkrijger那里拿了一个例子并把它变成一个清晰的全部(停止并删除全部)
如果您不想删除所有容器,则可以选择在具有
docker ps --before <container-ID>
或docker ps --since <container-ID>
的特定容器之前或之后创建的所有容器 . 此功能至少在Docker版本0.6.5中 .假设您已经开发了系统,现在它正在运行,但仍有许多容器 . 您想要删除在该工作版本之前创建的容器 . 使用
docker ps
确定工作容器的ID .Remove containers created before an other container
另一个例子 . 您的数据库已经在Docker容器上运行 . 您已经开发了应用程序以在另一个容器上运行,现在您有许多不需要的容器 .
Remove containers created after a certain container
Docker将容器存储在Ubuntu的
/var/lib/docker/containers
中 . 我认为额外的容器不会造成其他伤害,但会占用磁盘空间 .这是我的
docker-cleanup
脚本,它删除未标记的容器和图像 . 请检查来源是否有任何更新 .资料来源:https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup
Docker 1.13.x中有一个名为Docker container prune的新功能:
docker container prune
这将做你想要的,并且应该以相同的方式在所有平台上工作 .
还有一个Docker system prune:
docker system prune
,它将在一个命令中清理容器,图像,卷和网络 .Original Answer:
有一些关于Docker清理命令的讨论 . 你可以在这张票上找到这些信息:Implement a 'clean' command(#928)
在该命令可用之前,您可以将Docker命令与其他Unix命令组合在一起以获得所需的信息 . 以下是如何清理旧周的旧容器的示例:
为了给予信任,它应该到期,这个例子来自https://twitter.com/jpetazzo/status/347431091415703552 .
https://github.com/HardySimpson/docker-cleanup
Docker清理
一个很小的一体化外壳,可以删除:
超过一天前运行的容器
不属于任何剩余容器的图像
打算作为crontab作业运行
功能
它将删除所有
<none>:<none>
图像如果图像有多个repo:tag引用它,除了运行容器外,它将删除所有repo:标记 . 实际上这是"docker rmi"的性质 .
屏幕上将显示许多错误消息,您可以决定是否
2>/dev/null
从docker-gc学习一些东西,并修复它的问题(它不能删除有多个repo:tag的图像)
因此,我个人建议将此作为图像和容器的部署脚本的一部分,仅保留最近的n个容器和图像 . 我使用与
git tag
相同的版本控制模式标记我的Docker镜像,并始终使用"latest."标记最新的Docker镜像 . 这意味着在不清理任何内容的情况下,我的Docker图像结束了喜欢:现在,我当然不是最好的朋友.137223_这是你最好的朋友 . 由于
docker images
和docker ps
都按日期排序,我们可以使用tail
来选择除前三个之外的所有内容并将其删除:将其与您的部署脚本(或本地)一起运行,以始终保持足够的图像以便舒适地回滚,而不会占用太多空间或使旧图像混乱 .
就个人而言,我任何时候都只在我的 生产环境 箱上放置一个容器,但如果你想要更多,你可以用容器做同样的事情:
最后,在我的简化示例中,我们一次只处理一个存储库,但如果您有更多,则可以使用相同的想法获得更复杂的功能 . 假设我只想保留some_repo / some_image中的最后三个图像 . 我可以混合
grep
和awk
并继续前进:同样,同样的想法适用于容器,但是到目前为止你得到它,所以我将不再给出例子 .
您只能删除已停止的容器 . 在开始时停止所有这些
docker stop $(docker ps -a -q)
然后你可以删除
docker rm $(docker ps -a -q)
使用Docker 1.13(2016年第4季度),您现在拥有:
docker system prune -a将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像) .
docker system prune
没有-a将删除(对于图像)仅悬空图像或没有标记的图像,如smilebomb由smilebomb .请参阅PR 26108和commit 86de7c0,它们引入了一些新命令,以帮助显示Docker守护程序数据在磁盘上占用多少空间,并允许轻松清理"unneeded"多余的空间 .
正如wjv评论,
在commit 913e5cb中引入,仅适用于Docker 1.13 .
使用:
它强制停止并移除当地存在的所有容器 .
删除从特定图像创建的所有容器:
The official way是:
Docker维护者已经表示不会有这样的命令 - 你可以编写这样的命令:
Remove all stopped containers.
这将通过使用docker ps -a -q获取所有容器的列表并将其id传递给docker rm来删除所有已停止的容器 . 这不应该删除任何正在运行的容器,它会告诉你它无法删除正在运行的图像 .
Remove all untagged images
现在您要清理旧图像以节省一些空间 .
New way: spotify / docker-gc发挥作用 .
已删除超过一小时前退出的容器 .
删除之后不属于任何剩余容器的图像
它支持环境设置
Forcing deletion of images that have multiple tags
Forcing deletion of containers
Excluding Recently Exited Containers and Images From Garbage Collection
此设置还可以防止删除创建的帧数小于GRACE_PERIOD_SECONDS秒前的图像 .
Dry run
Cleaning up orphaned container volumes CLEAN_UP_VOLUMES = 1
参考:docker-gc
Old way to do:
delete old, non-running containers
delete all images associated with non-running docker containers
cleanup orphaned docker volumes for docker version 1.10.x and above
Based on time period
另一种方法,我从Guillaume J. Charmes获得(信用到期):
将以优雅的方式移除所有容器 .
对于Windows,由Bartosz Bilicki撰写:
对于PowerShell:
使用Docker 1.13(2016年第4季度)更新,归功于VonC(later in this thread):
docker system prune 将删除所有未使用的数据(即按顺序:容器停止,没有容器的卷和没有容器的图像) .
请参阅PR 26108和commit 86de7c0,它们引入了一些新命令,以帮助显示Docker守护程序数据在磁盘上占用的空间,并允许轻松清理多余的空间 .
首先,在尝试删除容器之前停止运行容器
删除正在运行的容器
您可以使用
kill
而不是stop
. 在我的情况下,我更喜欢stop
,因为我倾向于重新运行它们而不是每次创建一个新的,所以我试图很好地关闭它们 .Note: 尝试停止容器会出错:
删除所有容器
从Windows shell中删除所有容器:
Update: 从Docker 1.13版(2017年1月发布)开始,您可以发出以下命令来清理已停止的容器,未使用的卷,悬空图像和未使用的网络:
如果您想确保只删除具有
exited
状态的容器,请使用以下命令:同样,如果你正在清理docker的东西,你可以摆脱未标记的,未命名的图像办法:
尝试使用此命令清理容器和悬空图像 .
停止/删除所有容器和图像的基本步骤
docker ps -aq
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
Note: 首先,您必须先停止所有正在运行的容器,然后再将其删除 . 在删除图像之前,您必须停止并删除其依赖容器 .
删除所有已停止的容器
来自pauk960的评论: