我如何清理我的docker主机

当我创build/debugging一个docker镜像/容器docker似乎在我的系统上留下各种各样的工件。 (有一次有48张图片限制)但是最后一次我看了20-25张图片; docker images

所以总的问题是:

  • 如何正确清理?
  • 因为我手动删除图像更多开始到达。 是吧?
  • 我应该真正分配给主机多less磁盘空间?
  • 运行后台程序真的重新启动后,下一次重新启动?

和元问题…有什么问题没有问我需要?

删除“晃来晃去”的图像也是有帮助的

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

以下是我如何定期清除我的docker主机:

终止运行容器:

 docker kill $(docker ps -qa) 

删除所有容器(及其关联的卷):

 docker rm -v $(docker ps -qa) 

删除所有图像:

 docker rmi $(docker images -q) 

更新

只删除没有运行的容器。 parsing“已退出”string的“ps”输出:

 docker ps -a | awk '/Exited/ {print $1}' | xargs docker rm -v 

不完美…不要给你的容器命名为“退出”:-)

更新

Docker 1.9有一个新的卷命令,可以用来清除旧的卷

 docker volume rm $(docker volume ls -qf dangling=true) 

更新

docker工人最新的社区版本有一个新的“系统修剪”命令

 docker system prune --volumes 

这清除了未使用的networking,杀死停止的容器,悬挂的图像和任何未使用的卷。

我还想用一些添加到1.13.0版本的命令来为此作出贡献:

 $ docker system prune $ docker container prune $ docker image prune $ docker volume prune $ docker network prune 

查看更新日志: 1.13.0(2017-01-18)

添加新的docker system命令与dfprune子系统资源pipe理,以及docker {container,image,volume,network} prune子命令#26108#27525 /#27525

更新:在docker cli中有内置的filter,可以正确显示符合特定条件的容器。 这些bash函数来自核心维护者的点文件之一 :

 dcleanup(){ docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null } del_stopped(){ local name=$1 local state=$(docker inspect --format "{{.State.Running}}" $name 2>/dev/null) if [[ "$state" == "false" ]]; then docker rm $name fi } 

原始答复

我为自己创build的帮手脚本:

 #!/bin/bash # options: # remove stopped containers and untagged images # $ dkcleanup # remove all stopped|running containers and untagged images # $ dkcleanup --reset # remove containers|images|tags matching {repository|image|repository\image|tag|image:tag} # pattern and untagged images # $ dkcleanup --purge {image} # everything # $ dkcleanup --nuclear if [ "$1" == "--reset" ]; then # Remove all containers regardless of state docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove." elif [ "$1" == "--purge" ]; then # Attempt to remove running containers that are using the images we're trying to purge first. (docker rm -f $(docker ps -a | grep "$2/\|/$2 \| $2 \|:$2\|$2-\|$2:\|$2_" | awk '{print $1}') 2>/dev/null || echo "No containers using the \"$2\" image, continuing purge.") &&\ # Remove all images matching arg given after "--purge" docker rmi $(docker images | grep "$2/\|/$2 \| $2 \|$2 \|$2-\|$2_" | awk '{print $3}') 2>/dev/null || echo "No images matching \"$2\" to purge." else # This alternate only removes "stopped" containers docker rm -f $(docker ps -a | grep "Exited" | awk '{print $1}') 2>/dev/null || echo "No stopped containers to remove." fi if [ "$1" == "--nuclear" ]; then docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove." docker rmi $(docker images -q) 2>/dev/null || echo "No more images to remove." else # Always remove untagged images docker rmi $(docker images | grep "<none>" | awk '{print $3}') 2>/dev/null || echo "No untagged images to delete." fi exit 0 

资源

对你的问题:

如何正确清理?

没有官方的方式,只是像上面的帮手脚本和function。

因为我手动删除图像更多开始到达。 是吧?

您可能已经删除了在其他人的基础上构build的图像,当您尝试删除图像时,这些图像变为“未加标签”。

我应该真正分配给主机多less磁盘空间?

取决于您计划使用的图像types。 要知道,多次运行一个500 MB的图像不会使用(500MB X的容器)空间。 容器重复使用相同的图像,只需在顶部运行时添加它们所改变的内容。 所以从图像存储的angular度来看,不是一个关于存储的容器运行库。

运行后台程序真的重新启动后,下一次重新启动?

默认情况下,主机重新启动时会停止。 您需要使用docker run --restart=True以在主机重新启动时自动重新启动。

我正在使用Docker-Machine和VirtualBox,在删除所有容器和所有图像后,Docker VirtualBox图像仍然消耗了几千兆字节的磁盘空间。

为了还清理磁盘空间,它有助于删除和重新创build泊坞窗机器。 例如:

 docker-machine rm default docker-machine create --driver virtualbox default 

有时你不会有状态,它只是空白。

这里是我的版本:

 docker rm -f $(docker ps -a | env -i grep -v Up | tail -n+2 | cut -d ' ' -f 1)