如何移除旧的Docker容器

1455
这个问题涉及到是否应该担心不需要的未运行 Docker 容器?
我想知道如何删除旧的容器。使用docker rm 3e552code34a可以删除一个容器,但是我已经有很多了。docker rm --help没有提供选择选项(例如全部或按镜像名称)。
也许有一个目录存储这些容器,我可以手动轻松删除它们吗?

23
你也应该考虑清理孤立的Docker数据卷。我经常发现它们占用的空间比旧容器和旧镜像还要多。一个好的脚本可以帮助你删除这些孤立的Docker数据卷,你可以从这里获取:https://github.com/chadoe/docker-cleanup-volumes。 - Nemanja Trifunovic
也许 https://github.com/chadoe/docker-cleanup-volumes 可以帮助你。 - Mihai8
14
在Docker 1.13(2016年第四季度)中,您还可以考虑使用新的docker system prune命令。请参见我的下面的回答 - VonC
@VonC 这在我的 Docker version 1.12.3, build 6b644ec 上没有用 :) - ReynierPM
1
使用Docker管理工具Portainer我们可以使用这个工具来管理所有旧的容器、未使用的卷和镜像它是一个简单的Docker管理UI请参考下面我的更新,了解如何部署应用程序 - Anish Varghese
显示剩余2条评论
67个回答

2
这个过程包含两个步骤(停止和移除):
  1. Stop the container that is being used by any running microservices

    docker stop $(docker ps -a -q)
    
  2. Remove all the containers

    docker rm $(docker ps -a -q)
    
  3. Remove single container

    docker rm container-ID
    

2
docker rm --force `docker ps -qa`

2

对于任何感兴趣的人,我将qkrijger的示例转化为“清除全部”(停止并删除全部)

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

如果您无论如何都要删除容器,那么使用命令docker rm -f $(docker ps --no-trunc -aq)会更快。 - qkrijger
如果您需要通过适当的关闭来清理共享或重复使用的资源(即附加卷、正确关闭的活动连接等),那么您需要先调用stop。一个很好的例子是,如果您有一个Jenkins容器,那么杀死容器是一个坏主意。您希望它保存任何未持久化的更改,警告已登录的用户,并且非常重要的是,正确停止所有构建。 - Kraig McConaghy
同意,那是一个非常有效的用例。 - qkrijger

2

删除所有容器:

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

解释:

sudo docker ps -a

返回容器列表。
awk '{print $1}'

获取容器ID的第一列。

grep -v CONTAINER

去掉标题。

最后一个管道将ID安全地发送到sudo docker rm -f


哇,对于像我这样的新手用户来说,听起来有点复杂。您能否添加一些关于它所做的事情和管道的说明。如果您能检查一下我的答案,我将不胜感激。我的答案链接 - Mostafa Ghadimi
我添加了一个解释。 - Felipe

2

我发现下面的命令非常方便,可以停止并删除所有容器。如果使用了-f(强制)标志,则不需要使用另一条命令显式停止,因为它会停止所有正在运行的容器:

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

2

请使用以下嵌套命令:

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

这个命令会停止所有正在运行的容器。

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

这个命令会删除所有容器。


2
如果你想要自动/定期清理已退出的容器并删除未被正在运行的容器使用的镜像和卷,你可以下载镜像meltwater/docker-cleanup
我在生产环境中使用它,因为我们每天在多个服务器上部署多次,我不想去每个服务器进行清理(那会很麻烦)。
只需运行:
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选项设置所需的时间间隔),并清理退出的容器和镜像。
更多详情请参考:Docker Cleanup

2
这里有一个脚本,可以删除创建时间超过2天的正在运行和已停止的容器:
#!/bin/bash
# This script will kill and remove containers older than 2 days.
#
docker ps -aq > /scripts/containers.txt
today=`date +%Y-%m-%d`
oldate=`date --date="2 day ago" +%Y-%m-%d`
while read p; do
    cont=`docker inspect -f '{{ .Created }}' $p | cut -c 1-10`
    echo " Created date of $p is $cont"
    k=`echo $(( ( $(date -ud $today +'%s') - $(date -ud $cont +'%s'))/60/60/24 ))`
    echo $k
    if [ $k -ge 2 ];
    then
            echo "Killing docker container $p"
            docker kill $p
            echo "Removing docker container $p"
            docker rm $p
    else
            echo "Docker container $p is not one day old, so keeping the container."
    fi
done </scripts/containers.txt

2

在Ubuntu 14.04(Trusty Tahr)上:

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

这只是一个普通的Bash命令,因此它应该适用于每个符合Bash标准的终端。


第一个“$”符号是不是应该放在终端中(还是它是提示符的一部分)? - Peter Mortensen
@PeterMortensen 第一个 $ 只是表示它是 shell 提示符 https://en.wikipedia.org/wiki/Command-line_interface#Command_prompt - sobi3ch

2

删除所有由某个镜像创建的容器:

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

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