如何删除旧的Docker容器


1234

这个问题与 我是否应该担心多余的,未运行的Docker容器有关?

我想知道如何删除旧容器。的docker rm 3e552code34a让你删除一个,但我有很多了。docker rm --help没有提供选择选项(如全部,或按图像名称)。

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


21
您还应该考虑清理孤立的Docker卷。我经常发现它们比旧容器和旧图像占用更多的空间。删除孤岛Docker卷的良好脚本可在github.com/chadoe/docker-cleanup-volumes中找到
Nemanja Trifunovic

也许github.com/chadoe/docker-cleanup-volumes可以为您提供帮助。
Mihai8'9

您还可以docker run--rm标志一起使用,这将使容器成为临时容器,并在运行后删除所有容器文件。
Gordon

12
使用docker 1.13(2016年第四季度),您还可以考虑使用新docker system prune命令。请参阅下面的答案
VonC

1
使用docker管理工具Portainer 我们可以all the old containers, non using volumes and images使用此工具进行管理对于docker而言,它是一个简单的管理UI Please refer my update below on how to deploy the application
Anish Varghese

Answers:


1459

Docker 1.13.x开始,您可以使用Docker容器prune

docker container prune

这将删除所有停止的容器,并且应在所有平台上以相同的方式工作。

还有一个Docker系统修剪

docker system prune

它将在一个命令中清除所有未使用的容器,网络,映像(悬空和未引用),以及可选的卷。


对于较旧的Docker版本,您可以将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


92
删除所有未标记图像的类似命令: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj

7
@MichelMüller从dockerfile构建映像时,可以指定在-rm成功构建后删除中间容器的选项。
Freek Kalter 2013年

3
@MichelMüller图像是用于缓存的图像,因此删除容器不会影响图像。
肯·科克伦

7
如果您想使用awk进行此操作,如果您想运行所有已停止的容器(由于第一行而没有错误),请考虑以下命令:docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi 2014年

3
这应该是删除未标记图像的更新命令docker rmi $(docker images -q -f dangling=true)
Ghjnut

626

我从Guillaume J. Charmes(在应交的贷方)获得的另一种方法:

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

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

对于Windows,由Bartosz Bilicki撰写:

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 26108commit 86de7c0,它们正在引入一些新命令,以帮助简化可视化Docker守护程序数据在磁盘上占用的空间并允许轻松清除“不需要的”多余空间。

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

11
这对我不起作用,但是对我有用docker ps -a -q | xargs docker rm,(可能需要sudo)
FUD 2014年

86
docker rm $(docker ps -a -q)呢?
qkrijger 2014年

8
@qkrijger,除了添加bashism之外,这与您的原始答案没有任何改变。问题出在命令行溢出。xargs变体以一种很好的方式处理它。我还将在docker ps上添加--no-trunk以避免(不太可能)id冲突。
Ihor Kaharlichenko

8
请注意,如果您使用仅数据容器,它也会将其删除
Dzung Nguyen 2014年

4
我不明白这一点,--no-trunc因为docker rm无论如何也不需要完整的ID。
2014年

411

更新了答案 使用docker system prunedocker container prune现在。请参阅VonC的更新答案

上一个答案由 上面的几个不同提示组成的,删除所有非运行容器的最优雅方法似乎是:

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

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

7
这应该是正确的答案,因为它依靠docker告诉您不再使用的容器,而不是假设$(docker images)的文本输出格式不会改变。仅产生一个额外的过程而不是两个的奖励点。
eurythmia

18
您可能需要添加-v以避免卷悬空:docker rm -v $(docker ps -q -f status=exited)。有关悬空卷的详细信息,请参阅docs.docker.com/userguide/dockervolumes/…
鲁巴2015年

@rluba显然在Docker 1.9中将​​有一个单独的卷api用于处理该问题。github.com/docker/docker/pull/14242
Ryan Walls

别名可能很方便:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung

与标记为正确的答案不同,@ RyanWalls答案可以在OSX上使用,并且更加简洁。

255

官方方式是:

docker rm `docker ps -aq`

Docker维护人员已指示对此将没有命令-您可以编写如下命令:

我们之前已经讨论过,希望用户使用上面的代码而不必向Docker添加其他代码。


6
但是,这是一个不好的解决方案,因为它还会删除存储容器。
Sobrique '16

8
您是什么意思“存储容器”?如果您是指仅用于数据容器的数据容器,这些容器曾经用于保留对数据卷的引用,则由于docker volume子命令和命名卷的可用性,不再需要这些容器。
L0j1k '16

请注意,这在Windows Powershell中不起作用。为此,这是一个更好的解决方案:stackoverflow.com/a/23674294/1150683
Bram Vanroy

@Sobrique如果您没有反应,至少您应该删除您的评论,这几乎是完整的有害的废话。
彼得-恢复莫妮卡

128

借助Docker 1.13(2016年第四季度),您现在拥有:

docker system prune -a 将删除所有未使用的数据(即,顺序为:容器停止,无容器的卷和无容器的映像)。

docker system prune而不-a将删除(对于图像)仅悬空的图像,或图像,而无需标记,作为评价smilebomb

请参阅PR 26108commit 86de7c0,它们正在引入一些新命令,以帮助简化可视化Docker守护程序数据在磁盘上占用的空间并允许轻松清除“不需要的”多余空间。

docker system prune -a

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,可用于删除仅一种类型对象的未使用实例。

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

docker container prune

感谢您的分享-为了让大家看到这些内容,我在
话题中

像往常一样,添加-f标志以强制清除而不会出现任何问题。
德克

3
应该标记为当今的正确答案,以上大部分都可以让时光倒流,但如今却过于复杂
Eugen Mayer

同意,最近要容易得多,快上去吧!
Maxim Geerinck

代码块中的描述适用于docker system prune -a,它将删除未使用的图像。docker system prune仅删除悬空的图像或没有标签的图像。
smilebomb

104

现在可以使用过滤docker ps

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

对于图像

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

但是,如果没有匹配的容器,则其中任何一个都将导致docker rmdocker 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筛选。


2
请注意此功能的真正优势-您不会意外杀死storage色粉。
Sobrique '16

3
您还可以status=created用来获取未运行和从未运行过的服务器。
enderland '16

96

2019年更新(最新)

docker container prune

这种-2017(旧)方式

删除所有停止的容器

docker rm $(docker ps -a -q)

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

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

3
不赞成投票,因为这肯定不是您在2017年的方式-否则docker volume/container/image prune,请参阅stackoverflow.com/a/39860665/3625317
Eugen Mayer

6
投票反对降低票数,因为a)这个答案是从2016年开始的,并且b)很多人都没有走上潮流的边缘。
敏锐,

49

删除所有停止的容器:

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

来自pauk960的评论:

1.3.0版开始,您可以将过滤器与一起使用docker ps,而非grep Exiteduse docker ps -a -f status=exited。如果-q与它一起使用,则只能获取容器ID而不是完整的输出,而无需使用awk。


33

如果您不希望删除所有容器,则可以使用docker ps --before <container-ID>或通过来选择在特定容器之前或之后创建的所有容器docker ps --since <container-ID>。此功能至少在Docker 0.6.5版中。

假设您已经开发了系统,现在可以使用了,但是还剩下许多容器。您要删除在该工作版本之前创建的容器。用确定工作容器的ID docker ps

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

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

另一个例子。您的数据库已经在Docker容器上运行。您已经开发了可以在另一个容器上运行的应用程序,现在您有了许多不需要的容器。

删除在某个容器之后创建的容器

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

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


32

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

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

22

这是我的docker-cleanup脚本,该脚本删除了未标记的容器和图像。请检查源是否有任何更新。

#!/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


@BradMurray谢谢!您可能还会喜欢这些:github.com/blueyed/dotfiles/commit/…– blueyed 2014
6

3
由于存在该xargs --no-run-if-empty选项
因此

13

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

删除正在运行的容器

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

您可以使用kill代替stop。就我而言,我更喜欢,stop因为我倾向于重新运行它们,而不是每次都创建一个新的,所以我试图很好地关闭它们。

注意:尝试停止容器会给您一个错误:

错误:无法删除正在运行的容器,请先将其停止

取出所有容器

docker rm $(docker ps -a -q)


10

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

Docker清理

一个很小的多合一外壳,可删除:

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

打算作为crontab作业运行

特征

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

9

因此,我个人建议将此操作作为映像和容器的部署脚本的一部分,仅保留最新的n个容器和映像。我使用与我使用的相同版本控制架构标记Docker映像,git tag并始终使用“最新”标记最新的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两者都按日期排序,因此我们可以使用tail来选择除前三个以外的所有内容并将其删除:

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

与您的部署脚本一起(或在本地)运行该脚本,以始终保留足够的映像以舒适地回滚,而不会占用过多的空间或使旧映像混乱。

就个人而言,我随时只能在生产盒上保留一个容器,但是如果您想要更多,则可以对容器执行相同的操作:

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

最后,在我的简化示例中,我们一次只处理一个存储库,但是如果您拥有更多的存储库,那么使用相同的思想就可以变得更加复杂。说我只想保留some_repo / some_image中的最后三个图像。我可以在混合grepawk和我的路:

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

同样,相同的想法也适用于容器,但是到这一点您已经明白了,所以我将不再给出示例。


8

采用:

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

它会强行停止并卸下本地所有存在的容器。


请编辑更多信息。不建议使用纯代码和“尝试此”答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该“尝试此”。我们在这里努力成为知识的资源。
Brian Tompsett-汤莱恩

在Ubuntu 16.04中,docker需要使用sudo,因此您必须编写sudo docker rm -f $(sudo docker ps -a -q)
Elliott

另外,它也可以在Powershell下的Windows中使用!
罗伯特·伊万克

我认为@Elliott sudo到处都是必需的,除非您将用户添加到“ docker”组。我通过将我的用户添加到docker组来使用不带sudo的ubuntu 16.10。
Emory

7

删除5个最旧的容器:

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

查看还剩下多少个容器:

docker ps -aq | wc -l

干得好@Pithikos。我添加了删除所有旧容器的答案。
Mostafa Ghadimi

7

卸下所有停止的容器。

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”)


不要忘记通过指定-v选项删除docker卷(sudo docker rm -v $(sudo
docker

没看这个,但我猜是这样的:docker ps -aq | xargs docker rm -v
奎因(Quie)

这仅适用于Linux,不适docker rm -f $(docker ps -a -q)用于Windows。但是适用于Windows的PowerShell / Docker。
彼得·莫滕森

6

新方法: 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

此设置还可以防止删除少于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

1
有趣的选择。+1
VonC

6
  1. 删除所有docker进程:

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

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


4
#!/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

对于那些不想自己搜索的人github.com/spotify/docker-gc
grim

这是完美的。我也写了一个具有相同功能的答案。
Mostafa Ghadimi

3

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

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


感谢您添加/ var / lib /
docker

问题是如何删除容器,而不是图像。
pauk960 2015年


3

尝试使用此命令清洁容器并悬挂图像。

docker system prune -f

这是一个了不起的专业提示!
b01

3

停止/删除所有容器和图像的基本步骤

  1. 列出所有容器

    docker ps -aq

  2. 停止所有正在运行的容器

    docker stop $(docker ps -aq)

  3. 取出所有容器

    docker rm $(docker ps -aq)

  4. 删除所有图片

    docker rmi $(docker images -q)

注意:首先,您必须停止所有正在运行的容器,然后再将其删除。同样,在删除图像之前,您必须停止并删除其依赖的容器。


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 2015年

是的,但是如果您需要它通过适当的关机来清除共享或重用的资源(即,附加卷,正确关闭的活动连接等),则需要先调用stop。很好的例子,如果您有一个詹金斯(Jenkins)容器,那么杀死该容器是一个坏主意。您希望它保存所有未更改的更改,警告已登录的用户,并且非常重要的是正确停止所有构建。
Kraig McConaghy 2015年

同意,那是一个非常有效的用例
qkrijger 2015年

2
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi

5
回答时,最好对解决方案进行一些解释,而不仅仅是代码转储,否则可能会删除答案。
AlBlue


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.