我如何清理我的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
命令与df
和prune
子系统资源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)