如何清理docker覆盖目录?

how to clean up docker overlay directory?

我 运行 docker 通过 CoreOS 和 AWS 的 ECS。我有一个失败的图像,它被重新启动了很多次,而且容器还在附近——它们填满了我的驱动器分区。具体来说,/var/lib/docker/overlay/包含大量的files/directories.

我知道 docker-cleanup-volumes 是个东西,但它会清理 /volumes 目录,而不是 /overlay 目录。

docker ps -a 显示我的错误 docker 容器超过 250 次启动尝试。不过,它们不是 运行。

除了rm -rf /var/lib/docker/overlay/*,我如何I/should清理它?

这是我现在执行此操作的怪异方式。我不会接受它作为答案,因为我希望有更好的方法。

# delete old docker processes
docker rm `docker ps -a | grep Exited | awk '{print  }'`
  ignore_errors: true

# delete old images. will complain about still-in-use images.
docker rmi `docker images -aq`

我已经将它添加到我的开发环境中的 bashrc 中,并且每天都习惯 运行 它。

function cleanup_docker() {
  docker ps -f status=exited -q | xargs -r docker rm
  docker images -f dangling=true -q | xargs -r docker rmi
}

在某些情况下,以下脚本可以释放更多 space,因为它会尝试删除所有图像,但会静静地失败:

function cleanup_docker_aggressive() {
  for i in $(docker images --no-trunc -q | sort -u)
  do
    docker rmi $i 2> /dev/null
  done
}

遗憾的是,它们并不比您的解决方案干净得多。

编辑:从 Docker 1.13 开始,您可以使用 docker system:

docker system df    # to check what is using space
docker system prune # cleans up also networks, build cache, etc

编辑:从 Docker 2017.09 开始,您还可以使用 container and image

docker container prune
docker image prune -a

后者可以与 --filter "until=24h"

等精美过滤器一起使用

docker ps

  • --安静

  • --全部

  • --过滤器状态=退出


dockerrm

  • --力

docker 图片

  • --安静
  • --全部
  • --filter dangling=true

docker rmi

  • --力

你的 hacky 方式很好。

docker rm `docker ps -a | grep Exited | awk '{print  }'`

我的 hacky 方法是

docker rm $(docker ps --all | awk '/ago/{print }')

一个稍微干净的方法是 运行 docker ps--quiet (-q) 标志只得到 id 号和 --filter status=exited 到 --filter 只是退出的。

docker rm $(docker ps --filter status=exited --quiet) # remove stopped docker processes

或 运行 docker rm 使用 --force (-f) 标志和 docker ps 使用 --all (-a) 标志关闭甚至 运行ning 的

docker rm --force $(docker ps --all --quiet) # remove all docker processes

在多次构建失败后,可能占用所有磁盘 space 的是图像。要在 docker 主机上节省磁盘 space,请定期删除

未使用的 docker 图像
docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images

或者为了变得更激进,你可以 --force (-f) 它来清理 --all (-a) 图像

docker rmi --force $(docker images --all --quiet) # clean all possible docker images

@analytik 将其放入 .bashrc 函数的方法似乎是一个实用的想法

function cleanup_docker() {
  docker rm --force $(docker ps --all --quiet) # remove all docker processes
  docker rmi $(docker images --filter dangling=true --quiet) # clean dangling docker images
}

如果您习惯生成大量不需要的 docker 图片,请将其添加到 .bash_logout


Docker 可以使用另一个 docker 容器以简单的方式完成垃圾收集 https://github.com/spotify/docker-gc

您可以使用 https://github.com/flaccid/docker-docker-gc-crond

将其 运行 作为 cron

小心点,这个解决方案似乎删除了其他重要的东西。

您需要检查 images/containers 并删除 /opt/docker/overlay 中检查执行时未找到的文件夹

docker inspect $(docker ps -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

docker inspect $(docker images -qa) | grep -oE '[a-f0-9]{64}' >> inspect-hashs.txt

sudo ls -l /var/lib/docker/overlay > overlays.txt

diff -u  inspect-hashs.txt overlays.txt | grep -E '^\+' | grep -oE '[a-f0-9]{64}' | xargs sudo rm -rf /opt/docker/overlay/

我们刚开始遇到这个问题,btafarelo 的回答帮助我解决了问题,或者至少让我对删除 sha256 条目感觉更好。

系统信息:ec2 实例运行 ELB 背后的 CoreOS 1.12

  • 从 ELB
  • 中删除 docker 实例
  • 关机docker

    systemctl stop docker
    rm -rf /var/lib/docker/overlay/*
    
  • 执行命令的结果

    for d in $(find /var/lib/docker/image/overlay -type d -name '*sha256*'); do echo rm -rf $d/* ; done
    
  • 重启(恢复一切的最简单方法)

在服务重新启动后,这恢复了大约 25% 的磁盘空间,没有任何不良影响。

我们这边使用了:

sudo docker system prune -a -f

哪个救了我 3Go!

我们还使用了著名的命令:

sudo docker rm -v $(sudo docker ps -a -q -f status=exited)
sudo docker rmi -f  $(sudo docker images -f "dangling=true" -q)
docker volume ls -qf dangling=true | xargs -r docker volume rm

我们将它放在 cron 上以更有效地管理我们的磁盘 space。

参考: https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604/4

这是从 https://lebkowski.name/docker-volumes/

中清除 docker 覆盖目录的解决方案
docker images --no-trunc | grep '<none>' | awk '{ print  }' | xargs -r docker rmi

docker ps --filter status=dead --filter status=exited -aq | xargs docker rm -v

对于 Docker < 1.9 :

find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)')

或者 Docker >=1.9 :

docker volume ls -qf dangling=true | xargs -r docker volume rm

这是一个有效的选项:

docker rm -f $(docker ps -a |awk 'NR>1&&/Exited/{print }')

我遵循了这些简单的步骤

第1步:df -h [查看内存使用情况,确定是overlay文件夹占用的内存]。

第 2 步:sudo docker 系统修剪 [此 cmd 删除所有未使用的 containers/images/networks]

第 3 步:sudo docker image prune -a [对于任何悬挂图像,如果存在]

第 4 步:df -h [当然,覆盖数据已被删除]。

请注意 docker prune 命令不会清除 /var/lib/docker/overlay2 目录。 也不建议仅删除覆盖目录,因为它可能会影响现有容器。 我搜索了很多文章,但除了清理整个 docker 状态外,找不到任何清理覆盖目录的解决方案:

# Please understand that this will restart the docker engine in a completely empty state 
# i.e. you will lose all images, containers, volumes, networks, swarm state, etc. 
# You can obviously first take the backup of the directories that you want to keep and copy the contents back after restarting docker service.

service stop docker
rm -rf /var/lib/docker
service start docker

最后一条命令使 docker 服务再次恢复 /var/lib/docker 中的所有文件夹。