如何清理Docker

63

我刚刚注意到我的笔记本电脑磁盘空间不足。通过使用mate-disk-usage-analyzer发现,Docker使用了相当多的空间:

输入图像描述

docker/aufs/diff文件夹包含152个以-removing结尾的文件夹。

我已经运行了以下命令来清理:

Kill all running containers:
# docker kill $(docker ps -q)

Delete all stopped containers
# docker rm $(docker ps -a -q)

Delete all images
# docker rmi $(docker images -q)

Remove unused data
# docker system prune

And some more
# docker system prune -af

但是那个屏幕截图是在我执行这些命令之后拍摄的。

docker/aufs/diff是什么,为什么会占用这么多空间,我该如何清理它?

我使用的Docker版本是17.06.1-ce,构建版本是874a737。这发生在一次清理后,所以这肯定还是一个问题。


1
这不是一个容量问题 - 悬挂的卷可以通过 docker volume rm $(docker volume ls -f dangling=true -q) 命令来删除。 - Martin Thoma
1
@k0pernikus 这不是重复的问题。我已经停止了容器,删除了镜像和容器,删除了所有卷并运行了系统清理。另一个问题没有这样做。 - Martin Thoma
6个回答

50

以下是一种激进的解决方案。 它会删除所有您的Docker相关内容,包括卷。

$ sudo su
# service docker stop
# cd /var/lib/docker
# rm -rf *
# service docker start

请参阅https://github.com/moby/moby/issues/22207#issuecomment-295754078,以获取详细信息。

可能不是/var/lib/docker

在您的情况下,docker位置可能不同。 您可以使用磁盘使用分析器(例如mate-disk-usage-analyzer)查找需要最多空间的文件夹。

请参阅在主机上存储Docker镜像的位置?


4
这是一个粗暴的解决方案,它将删除所有容器、镜像和卷。原作者可能希望保留当前正在使用的镜像和卷。 - k0pernikus
3
@k0pernikus,我是楼主。我已经移除了所有的图片和音量,就像我在问题中写的一样。 - Martin Thoma
你抓住我的要害了。就拿这个例子来说,虽然这是一个解决问题的方法,但如果其他人仅为diff文件夹问题尝试此解决方案,则他们可能不会得到他们所期望的结果。 - k0pernikus
1
对我来说(Docker 版本 1.12),这是唯一有效的解决方案,即使我之前已删除了所有镜像和卷,并且 /var/lib/docker 只包含一个 *.db 文件,Docker 占用的空间也不会被回收。 - ibic
如果您正在使用AKS或任何其他云平台,您可能希望在执行任何操作之前先对磁盘进行快照,以便之后可以轻松恢复。特别是在Azure中,您可以将东西暂时移动到/mnt或其他虚拟临时空间,重新启动并查看,然后可能会移回;但请注意,那是一个未持久化和易失性的驱动器! - reim

15

Docker主要占用大量空间的三个方面:

  1. 检查已下载和编译的镜像。 运行以下命令清除未使用和失效的镜像。
    docker image prune -a 
  • Docker创建了许多卷,其中一些卷来自已经不存在的容器 使用以下命令清理卷并回收空间:
  •     docker system prune -af && \
        docker image prune -af && \
        docker system prune -af --volumes && \
        docker system df
    
    1. Docker容器日志非常容易生成几GB的日志,而overlay2存储容器层也是几GB数据的来源。更好的方法是计算Docker镜像的大小,然后使用以下指令限制Docker容器的存储和日志上限。要使用这些功能,请使用Docker V19及以上版本。
        docker run -it --storage-opt size=2G --log-opt mode=non-blocking --log-opt max-buffer-size=4m fedora /bin/bash
    

    10

    当使用AUFS存储驱动程序时(如果已加载AUFS内核模块,则默认),此目录是存储容器根文件系统层的位置。

    如果您有一堆*-removing目录,那么这是由于删除尝试失败引起的。这可能是由于各种原因导致的,最常见的原因是由于设备或资源繁忙而导致卸载失败。

    在Docker 17.06之前,如果使用docker rm -f命令删除容器,则即使在清理容器时出现错误(例如未能删除rootfs层),所有容器元数据也将被删除。 在17.06中,它将不再删除容器元数据,而是将容器标记为Dead状态,以便您可以再次尝试移除它。

    您可以安全地删除这些目录,但我建议先停止Docker,然后删除目录,最后再启动Docker。


    2
    还要注意的是,17.06.1 版本中存在一个明显的回归问题,可能导致您的问题。这个问题在即将发布的 17.06.2 版本中已经修复。 - cpuguy83
    2
    请问您能否添加一个命令列表,以便今天清理Docker时使用? - Martin Thoma
    1
    没有任何东西会自动清除这些删除目录,但是 docker system prune 是一条命令中清理未使用的内容的最佳方式。 - cpuguy83
    1
    我认为docker system prune应该在这里获得最多的赞。 - Darshan

    1
    请注意,这实际上是一个已知但仍未解决的问题:https://github.com/moby/moby/issues/37724。如果您遇到相同的问题,我建议您在GitHub上给该问题点赞,以便尽快得到解决。

    0

    我曾经遇到过同样的问题。 在我的情况下,解决方案是:

    1. 查看所有镜像:
      docker images

    2. 删除旧的未使用的镜像:
      docker rmi IMAGE_ID

    3. 可能需要清理已停止的容器:
      docker container prune

    p.s. docker --help 是一个好的解决方案 :)


    0
    在Macbook上运行Docker桌面版的macOS中,你可以按照以下步骤清除所有Docker镜像、容器、缓存和构件,以释放空间。
    # remove all build cache \
    docker builder prune -a && \
    # remove all stopped containers, unused networks, dangling images & build cache \
    docker system prune && \
    # remove unused images, all build cache \
    docker system prune -a
    

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