如何移除旧的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
为了仅仅移除正在运行的容器中当前未使用的所有内容,以下是我通常放在我的Mac的.bash_profile文件中的alias,它将有所帮助:
alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"

每当从命令行调用 dockerclean 时,它将删除已停止的容器和未使用的镜像层。对于正在运行的容器和已使用的镜像,它将打印警告消息并跳过它们。

2

我正在使用:

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

删除已存在的容器并且:

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

为了清除所有未标记的图像。

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

6
回答问题时最好加上解释说明解决方案的作用,而不是只提供代码,否则答案可能会被删除。 - AlBlue

1
这段简短的脚本可能会有所帮助(根据之前的答案编写而成)!
#!/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

这个答案的格式出现问题了。它应该是一个脚本还是两个脚本? - Dag Høidahl

1

对于Linux安装,请确保使用sudo。此外,最好寻找几个月或几周前的镜像:

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

2
请确保您阅读了Linux上Docker的安装说明,以避免需要使用sudo。 - qkrijger

1
删除特定容器。
docker container rm container_id

如果容器正在运行,您必须在删除之前停止它

docker container stop container_id

这条命令是用来删除所有现有容器的。
docker container rm $(docker container -a -q)

1

删除旧的Docker容器非常简单。

列出所有容器:

docker ps -a
docker ps (To list the running containers)

一旦你运行了 docker ps -a 命令,它会返回一个容器列表,包括容器 ID(由大小写字母和数字组成)。复制你想要删除的容器 ID,然后执行以下命令即可。
docker rm container_id

如果你使用的是Ubuntu,你的容器以及在/var/lib/docker/aufs中创建的层将会被一起删除。


1

根据我的经验,您应该在删除容器之前停止它们,以避免出现类似“此容器仍在运行”的错误,因此:

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"

您可以通过在 docker rm 命令中添加 -f 标志来删除正在运行的容器。 - Marcello Romani

1
使用Docker管理工具Portainer 我们可以使用这个工具来管理所有旧的容器、未使用的卷和镜像。
它是一个简单的Docker管理UI。
如何部署Portainer 使用以下Docker命令部署Portainer:
$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

您只需要使用浏览器访问运行portainer的Docker引擎的9000端口即可。
注意:选项-v /var/run/docker.sock:/var/run/docker.sock仅适用于Linux环境。

1
我使用以下内容的变体:
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)

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