如何清理我的docker主机

时间:2014-04-21 00:00:37

标签: docker coreos

当我创建/调试docker镜像/容器时,docker似乎在我的系统上留下了各种各样的工件。 (在某一点上有48个图像限制)但是我最后一次看到那里有20-25张图像; docker images

所以最重要的问题是:

  • 如何正确清理?
  • 因为我手动删除了更多的图片。啊?
  • 我应该为主机分配多少磁盘空间?
  • 下次重启后会运行守护进程真的重启吗?

和元问题......我没有问过哪些问题需要?

6 个答案:

答案 0 :(得分:35)

以下是我定期清除docker主机的方法:

杀死正在运行的容器:

docker kill $(docker ps -qa)

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

docker rm -v $(docker ps -qa)

删除所有图片:

docker rmi $(docker images -q)

更新

仅删除未运行的容器。解析“已退出”字符串的“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

清除未使用的网络,杀死已停止的容器,悬挂图像和任何未使用的卷。

答案 1 :(得分:23)

删除“悬空”图像也很有帮助

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

答案 2 :(得分:15)

我还想通过添加到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 systemdf子命令添加新的prune命令以进行系统资源管理,以及docker {container,image,volume,network} prune子命令#26108#27525 /#27525

答案 3 :(得分:5)

我正在使用带有VirtualBox的docker-machine,在删除所有容器和所有图像后,docker VirtualBox映像仍然消耗了数GB的磁盘空间。

要清理磁盘空间,还可以删除并重新创建docker机器。 E.g:

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

答案 4 :(得分:4)

<强>更新 docker cli中有内置过滤器,可以正确显示符合特定条件的容器。这些bash函数来自其中一个核心维护者&#39; dotfiles

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
}

原始答案

我为自己创建的帮助脚本:

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

source

问题:

  

如何正确清理?

还没有正式的方法,只是帮助脚本和上面的函数。

  

因为我手动删除了更多的图像。啊?

您可能一直在删除构建在其他已成为&#34;未标记&#34;当你试图删除它们时。

  

我应该为主机分配多少磁盘空间?

取决于您计划使用的图像类型。知道多次运行500 mb图像并不能使用(500mb X容器数量)空间。容器重用相同的图像,只需添加在顶部运行时更改的内容。因此,从图像存储角度考虑,而不是关于存储的容器运行时。

  

下次重启后会运行守护进程真的重启吗?

默认情况下,主机重新启动时会停止它们。您需要与docker run --restart=True一起运行,以便在主机重新启动时自动重新启动。

答案 5 :(得分:1)

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

这是我的版本:

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