【问题标题】:Why is docker image eating up my disk space that is not used by docker为什么 docker 映像会占用我未使用的磁盘空间
【发布时间】:2015-03-07 08:40:20
【问题描述】:

我已经设置了 docker,并且我使用了完全不同的块设备来存储 docker 的系统数据:

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

请注意,/disk/1 使用的是完全不同的硬盘/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

问题是,当我继续下载docker镜像并运行docker容器时,好像另一块硬盘/dev/xvda1也用完了。

我可以通过删除一些 docker 镜像来验证这个问题。在我删除了一些 docker 镜像后,/dev/xvda1 现在有了更多的额外空间。

我错过了什么吗?

我的 docker 版本:

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09

【问题讨论】:

  • 你能发个fdisk -l

标签: docker diskspace device-mapper


【解决方案1】:

删除我的整个 /var/lib/docker 对我来说是不行的。这些是更安全的方法:

解决方案 1:

问题中的以下命令为我清理空间,它比删除 /var/lib/docker 或 Windows 检查磁盘映像位置 here 安全得多。

之前:

docker info

示例输出:

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

较新版本的 Docker 中的命令,例如17.x +

docker system prune -a

它将向您显示一条警告,它将删除所有停止的容器、网络、图像和构建缓存。一般来说,删除它是安全的。 (下次运行容器时,它可能会从 Docker 注册表中提取)

示例输出:

Total reclaimed space: 1.243GB

然后您可以再次运行 docker info 以查看已清理的内容

docker info

解决方案 2:

除此之外,请确保 docker 容器内的程序不会向文件系统写入很多/巨大的文件。

检查你正在运行的 docker 进程的空间使用大小

docker ps -s #may take minutes to return

或者对于所有容器,甚至退出

docker ps -as #may take minutes to return

然后您可以删除有问题的容器/s

docker rm <CONTAINER ID>

找出可能占用空间的罪魁祸首

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

在我的例子中,程序正在编写临时文件。

Nathaniel Waisbrot 在接受的答案中提到了这个issue,我从这个问题中得到了一些信息)


旧版本 Docker 中的命令,例如1.13.x(以 root 而非 sudo 身份运行):

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

之后:

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB

【讨论】:

  • docker system prune --force 绝对是我见过的答案中最安全的选择。我的机器上的空间不足。修剪了吗,我现在有 50 Gb 空闲空间......希望我早点知道这一点
  • 对该答案的赞成票表明人们觉得它很有用。不过,为了清楚起见,这是在回答稍微不同的问题“我怎样才能回收 Docker 正在使用的空间?”而问题是关于 Docker 用尽了空间,但又说它没有(所以prune 是无用的,因为 Docker 看不到要修剪的东西)
【解决方案2】:

这是 devicemapper 的内核问题,它会影响 RedHat 系列操作系统(RedHat、Fedora、CentOS 和 Amazon Linux)。删除的容器不会释放映射的磁盘空间。这意味着在受影响的操作系统上,当您启动和重新启动容器时,您将慢慢耗尽空间。

Docker 项目意识到了这一点,并且内核应该固定在上游 (https://github.com/docker/docker/issues/3182)。

一种解决方法是给 Docker 自己的卷来写入 ("When Docker eats up you disk space")。这实际上并不能阻止它占用空间,只是阻止它占用系统的其他部分。

我的解决方案是卸载 docker,然后删除其所有文件,然后重新安装:

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

这让我的空间得到了恢复,但这与启动替换实例没有太大区别。我还没有找到更好的解决方案。

【讨论】:

  • 我刚刚经历了同样的事情,你不必卸载 docker。我需要做的就是停止 docker,删除目录,然后启动 docker。
  • 什么目录? /var/lib/docker ?如果我这样做,我就会失去我的形象。如果我尝试先将图像保存到 .tar 文件,也会失败:Error mount '/dev/mapper/docker-202:... input/output error
  • @Toby yes /var/lib/docker,这将删除您所有的图像和容器。你正在硬重置 Docker,所以不要指望能够保存你所有的东西。
【解决方案3】:

移动/var/lib/docker 目录。

假设/data 目录有足够的空间,如果没有,则替换一个,

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

这样,您不必重新配置 docker。

【讨论】:

  • 这真的很有帮助。我将 docker 从 os 磁盘发送到 azure 服务器实例上的另一个托管磁盘,工作起来就像一个魅力
【解决方案4】:

遇到了同样的问题。在我的场景中,我的 vbox 存储空间不足。经过调查发现我的 docker 本地卷消耗了 30gb。 Ubuntu 16.04 主机。

找出你的。

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

这会释放未使用的本地卷的磁盘空间。在我的场景中释放了 20 GB 的存储空间。如果您想保留它们,请确保您要保留的容器正在运行,因为这会删除所有停止的容器。

【讨论】:

  • 这不直接回应原始问题,但在类似情况下很有用。
【解决方案5】:

我遇到了类似的问题,我认为当您的磁盘中没有足够的空间用于所有 docker 映像时会发生这种情况。我为 docker 图像保留了 6GB,但在我的情况下这还不够。无论如何,我已经删除了每个图像和容器,但磁盘看起来仍然是满的。 /var/lib/docker/devicemapper 和 /var/lib/docker/tmp 使用了大部分空间。

这个命令对我不起作用:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

首先,我停止了 docker 服务:

sudo service docker stop

然后我删除了/var/lib/docker:

然后我做了有人在https://github.com/docker/docker/issues/18867#issuecomment-232301073这里建议的事情

  • 删除现有的 docker 元数据实例 rm -rf /var/lib/docker

    sudo rm -rf /var/lib/docker

  • 将以下选项传递给 docker 守护进程:-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

  • 启动 docker 守护进程。

对于最后两个步骤,我运行:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

【讨论】:

    【解决方案6】:

    Docker prune 默认不删除卷,

    你可以试试

    docker volume prune -f
    

    【讨论】:

    • docker system prune --volumes 完美运行。以前是--volume,现在是--volumes。
    • docker system prune --all --volumes
    【解决方案7】:

    正如 Github.com 的 issue #18867 - Delete data in a container devicemapper can not free used space 中所述

    尝试运行以下命令:

    # docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/
    

    它使用fstrim 工具修剪设备映射器精简配置磁盘。

    【讨论】:

    • 这对我有用。可能是因为在循环模式下使用了 devicemapper。
    【解决方案8】:

    对于在 MacOS 中遇到此问题的人,对我有用的解决方案是查找 Docker.raw 文件,这是 Docker 用来在主机中保留逻辑空间然后删除的文件。如果你有 Docker Desktop,你可以去:

    Preferences -&gt; Resources -&gt; Advanced,然后在Disk image location 标签下查看。

    在终端中导航到该文件夹​​并删除Docker.raw 文件 ($ rm -rf Docker.raw)

    重要提示: 只有这样做,您才不需要任何现有的图像或卷。

    【讨论】:

      【解决方案9】:

      也许你可以尝试docker system prune 删除所有不重要的图像

      【讨论】:

        【解决方案10】:

        是的,Docker 使用 /var/lib/docker 文件夹来存储层。有一些方法可以回收空间并将存储移动到其他目录。

        您可以挂载更大的磁盘空间并将/var/lib/docker的内容移动到新的挂载位置并进行符号链接。

        上面有详细说明如何完成上述任务。

        http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

        你也可以去掉中间层。

        https://github.com/vishalvsh1/docker-image-cleanup

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2018-02-05
          • 1970-01-01
          • 2020-02-10
          • 2018-08-20
          • 1970-01-01
          相关资源
          最近更新 更多