Docker /var/lib/docker/devicemapper/devicemapper 使用 2.7GB

Posted

技术标签:

【中文标题】Docker /var/lib/docker/devicemapper/devicemapper 使用 2.7GB【英文标题】:Docker /var/lib/docker/devicemapper/devicemapper using 2.7GB 【发布时间】:2016-11-05 21:56:09 【问题描述】:

我是codiva online ide 的开发人员。每次用户运行 java 程序时,我们都会启动一个新容器。我们使用 devicemapper 存储驱动程序,因为这是我们能够设置容器大小上限的唯一方法。

使用几个月后,我们看到磁盘使用量在增加,而 /var/lib/docker/devicemapper/devicemapper 占用了大约 2.7GB。

我已删除所有未运行的 docker 容器和任何悬空卷,不幸的是,/var/lib/docker/devicemapper/devicemapper 的磁盘使用量仍显示为 2.7GB。

回收这个空间的最佳方法是什么?我们不需要任何持久化存储,我们可以删除所有数据,因为任何需要存储的数据,我们直接挂载主机目录,这些文件在 docker 之外进行管理。

sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

没有正在运行甚至停止的容器。 码头工人信息结果在这里。

$ sudo docker info
Containers: 1
Images: 14
Server Version: 1.9.1
Storage Driver: devicemapper
 Pool Name: docker-202:1-143417-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 107.4 GB
 Backing Filesystem: ext4
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 2.591 GB
 Data Space Total: 107.4 GB
 Data Space Available: 1.469 GB
 Metadata Space Used: 2.531 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 1.469 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.77 (2012-10-15)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-76-generic
Operating System: Ubuntu 14.04.3 LTS
CPUs: 1
Total Memory: 992.5 MiB
Name: ip-172-31-26-50
ID: NIQ5:2NDW:SB77:ZNZU:UO6G:EYLB:JIW7:SQLL:QLWY:LNRM:SU6P:ZS7X
WARNING: No swap limit support

没有悬空或孤立的卷。

sudo docker volume ls
DRIVER              VOLUME NAME

唯一的图片是java:8

sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
java                8                   289bdffc37d7        3 weeks ago         669.2 MB

我已经按照https://lebkowski.name/docker-volumes/ 的说明进行操作,但它仍在使用不必要的额外空间。

编辑1: 我添加了docker images -a 的结果。这显示了大量未命名的图像。大小看起来很可疑,因为所有这些图像的总和高达 4.5GB,但我的整个 /var/lib/docker 只有大约 2.7GB。

$ sudo docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
java                8                   289bdffc37d7        3 weeks ago         669.2 MB
<none>              <none>              5d7cc49c4372        3 weeks ago         668.8 MB
<none>              <none>              9e756f3b105a        3 weeks ago         310.9 MB
<none>              <none>              7615ebf33bb7        3 weeks ago         310.9 MB
<none>              <none>              ac079291ad51        3 weeks ago         310.9 MB
<none>              <none>              cd02ed4609aa        3 weeks ago         310.9 MB
<none>              <none>              07bbd1c2007f        3 weeks ago         310.9 MB
<none>              <none>              6331ed9a346a        3 weeks ago         310.9 MB
<none>              <none>              b647ad8e0a08        3 weeks ago         310.9 MB
<none>              <none>              f23012d4423e        3 weeks ago         310.9 MB
<none>              <none>              0d3e866c82f3        3 weeks ago         301 MB
<none>              <none>              c28cbef85c39        3 weeks ago         169.7 MB
<none>              <none>              3f0d3d140ce1        3 weeks ago         125.1 MB
<none>              <none>              17bd2058e0c6        3 weeks ago         125.1 MB

在尝试其中之一时,我得到了错误。 $ sudo docker rmi 5d7cc49c4372 来自守护进程的错误响应:冲突:无法删除 5d7cc49c4372(无法强制)- 图像具有依赖的子图像 错误:删除图片失败:[5d7cc49c4372]

在阅读它时,似乎唯一需要的图像 java:8 取决于这些子图像。

$ sudo docker history 289bdffc37d7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
289bdffc37d7        3 weeks ago         /bin/sh -c /var/lib/dpkg/info/ca-certificates   418.2 kB            
5d7cc49c4372        3 weeks ago         /bin/sh -c set -x  && apt-get update  && apt-   357.9 MB            
7615ebf33bb7        3 weeks ago         /bin/sh -c #(nop) ENV CA_CERTIFICATES_JAVA_VE   0 B                 
9e756f3b105a        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_DEBIAN_VERSION=8u9   0 B                 
ac079291ad51        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_VERSION=8u91         0 B                 
07bbd1c2007f        3 weeks ago         /bin/sh -c #(nop) ENV JAVA_HOME=/usr/lib/jvm/   0 B                 
cd02ed4609aa        3 weeks ago         /bin/sh -c    echo '#!/bin/sh';   echo 'set    87 B                
b647ad8e0a08        3 weeks ago         /bin/sh -c #(nop) ENV LANG=C.UTF-8              0 B                 
6331ed9a346a        3 weeks ago         /bin/sh -c echo 'deb http://httpredir.debian.   61 B                
f23012d4423e        3 weeks ago         /bin/sh -c apt-get update && apt-get install    9.93 MB             
0d3e866c82f3        3 weeks ago         /bin/sh -c apt-get update && apt-get install    131.2 MB            
c28cbef85c39        3 weeks ago         /bin/sh -c apt-get update && apt-get install    44.67 MB            
3f0d3d140ce1        3 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B                 
17bd2058e0c6        3 weeks ago         /bin/sh -c #(nop) ADD file:76679eeb94129df23c   125.1 MB 

这意味着,无法删除未标记的图像,我认为按照设计使用的总大小仍应为 ~670MB,因为 docker 仅存储依赖图像的差异。

请告诉我如何减少 devicemapper 的磁盘使用量。

【问题讨论】:

你能告诉我运行“docker images -a”时打印的内容吗?只是看看是否还有旧图层。 添加了docker images -a的结果,我看到大量看似未使用的图像 你见过github.com/chadoe/docker-cleanup-volumes吗? 【参考方案1】:

您必须删除与容器关联的卷!

为此,请使用以下命令:

docker rm -v $(docker ps -a -q -f status=exited)

【讨论】:

【参考方案2】:

这似乎是一个相当old bug with devicemapper,尤其是如果您使用的是 ext3。如果您使用的是 ext3,那么upgrading to ext4 可能会解决您的问题。该错误的主要症状是 devicemapper 不会释放已删除的图像和卷​​。

除此之外,您可以完全清除 /var/lib/docker 并重新安装,因为您说您可以解决数据丢失问题。

【讨论】:

以上是关于Docker /var/lib/docker/devicemapper/devicemapper 使用 2.7GB的主要内容,如果未能解决你的问题,请参考以下文章

Docker教程-1-学习及安装Docker

Docker教程-1-学习及安装Docker

Docker03 Docker基础知识Docker实战

Docker学习__docker命令[docker version 和 docker info]

[转帖]Docker里运行Docker docker in docker(dind)

docker 定时清理docker容器日志