如何删除旧的Docker容器

get 发布于 2019-03-21 docker 最后更新 2019-03-21 15:34 94 浏览

这个问题与Should I be concerned about excess, non-running, Docker containers?有关。 我想知道如何移除旧容器。 docker rm 3e552code34a可以让你删除一个,但我已经有很多了。 docker rm --help不提供选择选项(如全部或图像名称)。 也许有一个这些容器存储在哪里我可以轻松地手动删除它们的目录?

已邀请:

icum

赞同来自:

要在不哭的情况下移除所有容器:

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

qodio

赞同来自:

如果您想自动/定期清理已退出的容器并删除正在运行的容器未使用的图像和卷​​,您可以下载此图像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选项设置它多长时间)并清理已退出的容器和图像。 更多细节:https://github.com/meltwater/docker-cleanup/blob/master/README.md

set

赞同来自:

删除5个最旧的容器:

docker rm `docker ps -aq | tail -n 5`
查看剩余的容器数量:
docker ps -aq | wc -l

xquis

赞同来自:

您可以使用存储库https://github.com/kartoza/docker-helpers中的docker-helper。安装完成后,只需输入drmc即可。

id_cum

赞同来自:

在Ubuntu 14.04(Trusty Tahr):

$ for CON in `docker ps -qa`; do docker rm $CON ; done
这只是一个普通的Bash命令,所以它应该适用于每个符合Bash标准的终端。

eet

赞同来自:

docker rm -f $(docker ps -a -q)就可以了。它将停止容器并将其移除

get

赞同来自:

删除所有已停止的容器

docker rm $(docker ps -a | grep Exited | awk '{print $1}')
来自pauk960的评论:
Since version 1.3.0 you can use filters with docker ps, instead of grep Exited use docker ps -a -f status=exited. And if you use -q with it you can get container IDs only instead of full output, no need to use awk for that.

vsit

赞同来自:

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

  1. 列出所有容器 docker ps -aq
  2. 停止所有正在运行的容器 docker stop $(docker ps -aq)
  3. 删除所有容器 docker rm $(docker ps -aq)
  4. 删除所有图片 docker rmi $(docker images -q)
注意:首先,您必须在删除之前停止所有正在运行的容器。在删除图像之前,您必须停止并删除其相关容器。

nomnis

赞同来自:

更新的答案 立即使用docker system prunedocker container prune。请参阅VonC的更新答案:https://stackoverflow.com/a/39860665/411229 上一个答案 根据上面的几个不同提示,删除所有非运行容器的最优雅方法似乎是: docker rm $(docker ps -q -f status=exited)

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

ret

赞同来自:

Remvoing旧的docker容器非常容易 列出所有容器: -

docker ps -a

docker ps(列出正在运行的容器) 一旦你点击了docker ps -a,它会给你一个容器列表以及容器id(它是唯一的,并且是a-z,A-Z和0-9的组合)。复制您要删除的容器ID,然后点击下方

docker rm container_id 您的容器将与/ var / lib / docker / aufs中创建的层一起删除(如果您使用的是ubuntu)

wet

赞同来自:

我使用以下变体:

docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1
第一部分列出了所有流程。 第二个选择那些'cassandra'后跟'Exited'的那些。 第三个,删除图像ID后的所有测试,以便获得图像ID列表。 所以,
docker rm $(docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1)

wab

赞同来自:

因此,我个人建议将此作为部署脚本的一部分,用于图像和容器,仅保留最新的n个容器和图像。我使用与git tag相同的版本控制模式标记我的docker镜像,并始终使用“latest”标记最新的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中的最后3个图像。我可以混合使用grepawk并继续前进:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
同样,同样的想法也适用于容器,但是到目前为止你得到了它,所以我将停止举例。

gomnis

赞同来自:

这个简短的脚本可能有帮助(从以前的答案编译)!

#!/bin/bash
# Remove dangling images
IMAGE_IDS=$(sudo docker images -f "dangling=true" -q)
if [ -n "$IMAGE_IDS" ]; then
sudo docker rmi $IMAGE_IDS > /dev/null 2>&1
    echo 'Images removed' $IMAGE_IDS
fi
# Remove exited containers
CONTAINER_IDS=$(sudo docker ps -a -q -f status=exited)
if [ -n "$CONTAINER_IDS" ]; then
sudo docker rm -v $CONTAINER_IDS > /dev/null 2>&1
    echo 'Containers remove $CONTAINER_IDS'
fi

mqui

赞同来自:

要简单地删除正在运行的容器当前未使用的所有内容,我通常放入Mac上的.bash_profile的以下别名将有助于:

alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"
每当从命令行调用dockerclean时,它将删除已停止的容器以及未使用的图像层。对于运行容器和使用过的图像,它将打印一条警告消息并跳过它。

xporro

赞同来自:

docker rm --force `docker ps -qa`

rvero

赞同来自:

2017年更新(最新)

docker container prune

这 - 2017(旧)方式 删除所有停止的容器
docker rm $(docker ps -a -q)
删除所有容器(停止和未停止)
docker rm  -f $(docker ps -a -q)

get

赞同来自:

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

peum

赞同来自:

您可以使用一些Docker UI应用程序来删除容器。 抱歉广告,但我总是使用自己的应用程序做同样的事情。如果您正在寻找管理泊坞窗图像或容器https://github.com/alex-agency/AMHub的简单应用程序,则可以尝试使用它。 这是在Docker容器中运行的Docker UI Web应用程序。 要安装它,您只需要调用此cmd:docker run -d -p 80:80 -p 8000:8000 -e DOCKER=$(which docker) -v /var/run/docker.sock:/docker.sock alexagency/amhub

tut

赞同来自:

如果您不想删除所有容器,则可以选择使用docker ps --before <container-ID>docker ps --since <container-ID>在特定容器之前或之后创建的所有容器。此功能至少在docker版本0.6.5中。 假设您已经开发了系统,现在它正在运行,但仍有许多容器。您想要删除在该工作版本之前创建的容器。使用docker ps确定工作容器的ID。 删除在其他容器之前创建的容器

docker rm $(docker ps --before 9c49c11c8d21 -q)
另一个例子。您的数据库已经在docker容器上运行。您已经开发了应用程序以在其他容器上运行,现在您有许多不需要的容器。 删除在某个容器后创建的容器
docker rm $(docker ps --since a6ca4661ec7f -q)
Docker将容器存储在Ubuntu的/var/lib/docker/containers中。我认为额外的容器不会造成其他伤害,但会占用磁盘空间。

jquia

赞同来自:

根据我的经验,你应该在移除容器之前停止它们以避免诸如“这个容器仍在运行”之类的错误,所以:

sudo /usr/bin/docker ps -aq |  awk '{print $1}' | \
xargs --no-run-if-empty bash -c 'sudo docker stop $@; sudo docker rm $@' bash
我在我的dotfiles中保留了一个别名:
alias wipedocker="sudo /usr/bin/docker ps -aq |  awk '{print $1}' \
| xargs --no-run-if-empty bash -c 'sudo docker stop $@; sudo docker rm $@' bash"

nfugit

赞同来自:

更新:从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

nsunt

赞同来自:

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

Docker清理 一个很小的一体化外壳,可以删除:
  • 超过一天前运行的容器
  • 不属于任何剩余容器的图片
打算作为crontab作业运行

功能
  • 将删除所有<none>:<none>张图片
  • 如果图像有多个repo:tag引用,它将删除所有repo:标记,但运行容器除外。实际上它是“docker rmi”的本质。
  • 屏幕上会显示许多错误消息,您可以决定是否2>/dev/null
  • 从docker-gc中学习一些东西并解决它的问题(它无法删除具有多个repo:tag的图像)

uaut

赞同来自:

Docker 1.13.x中有一个名为Docker container prune的新功能: docker container prune 这将做你想要的,并且应该以相同的方式在所有平台上工作。 还有一个Docker system prune,它将在一个命令中清理容器,图像,卷和网络。 原答案: 有一些关于Docker清理命令的讨论。您可以在此票证中找到相关信息: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

nsit

赞同来自:

对于任何有兴趣的人,我从qkrijger那里拿了一个例子并把它变成一个清晰的全部(停止并删除全部)

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

bsit

赞同来自:

我在用着:

docker rm -v $(docker ps -a -q -f status=exited)
删除已退出的容器和:
docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")
为了摆脱所有未标记的图像。

jculpa

赞同来自:

The official way是:

docker rm `docker ps -aq`
Docker维护者已经表示不会有这样的命令 - 你可以编写这样的命令:
We have discussed this before and prefer users to use the above line without having to add additional code to Docker.

in_id

赞同来自:

  1. 删除所有泊坞程序进程:
    docker rm $(docker ps -a -q)
    
  2. 删除特定容器:
    $ docker ps -a (lists all old containers)
    $ docker rm container-Id
    

gquia

赞同来自:

删除所有已停止的容器

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

nsunt

赞同来自:

另一种方法,我从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年第4季度)的更新,归功于VonC(later in this thread): 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

lquia

赞同来自:

使用Docker 1.13(2016年第4季度),您现在拥有: 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
正如wjv评论,
There is also docker {container,image,volume,network} prune, which may be used to remove unused instances of just one type of object.
commit 913e5cb中引入,仅适用于Docker 1.13+。
docker container prune

nipsa

赞同来自:

您只能删除已停止的容器。在开始时停止所有这些 docker stop $(docker ps -a -q) 然后你可以删除 docker rm $(docker ps -a -q)

svelit

赞同来自:

现在可以将filteringdocker ps一起使用:

docker rm $(docker ps -q -f status=exited)
对于images
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过滤。

met

赞同来自:

这是删除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

kodit

赞同来自:

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

matque

赞同来自:

对于Linux安装,请确保使用sudo。寻找几个月和几周的图像也很好:

sudo docker ps -a | grep 'weeks ago\|months ago' | \
    awk '{print $1}' | xargs --no-run-if-empty sudo docker rm

rut

赞同来自:

这是我的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

yut

赞同来自:

这两行bash将在删除之前按某些关键字过滤容器:

containers_to_keep=$(docker ps -a | grep 'keep\|Up\|registry:latest\|nexus' | awk '{ print $1 }')
containers_to_delete=$(docker ps -a | grep Exited | grep -Fv "$containers_to_keep" | awk '{ print $1 }')
docker rm $containers_to_delete
来自this post

stotam

赞同来自:

从Windows shell中删除所有容器:

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

siusto

赞同来自:

我总是使用docker rmi $(docker ps -a -q)删除所有图像。 当docker rmi失败​​时,您可以删除目录/var/lib/docker/graph

xminus

赞同来自:

我知道stackengine的GUI中有一个多选功能,允许您一次删除多个容器。

miste

赞同来自:

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

cet

赞同来自:

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

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)
以下是删除docker上的旧图像的完整要点:Gist to remove old Docker containers and images

yut

赞同来自:

建议您先停止图像然后删除, 你可以去

$docker stop(docker ps -a)
$docker rm(docker ps -a)

nsequi

赞同来自:

使用:

docker rm -f $(docker ps -a -q)
它强制停止并移除当地存在的所有容器。

womnis

赞同来自:

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

删除正在运行的容器
docker rm $(docker stop -t=1 $(docker ps -q))
您可以使用kill而不是stop。在我的情况下,我更喜欢stop,因为我倾向于重新运行它们而不是每次都创建一个新的,所以我试图将它们很好地关闭。 注意:尝试停止容器会出错:
Error: Impossible to remove a running container, please stop it first

删除所有容器
docker rm $(docker ps -a -q)

lest

赞同来自:

您可以停止泊坞窗容器,一旦停止,您可以删除容器。 停止容器: $ docker stop“containerID” - 你也可以提到容器ID的前两个字母,它可以工作。 取出容器 $ docker rm“containerID” - 再次你也可以提到容器的前两个字母 如果这些命令不允许您停止/删除容器,请确保您有sudo访问docker host。

ieos

赞同来自:

删除从特定图像创建的所有容器:
docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')