为什么docker报告新的ubuntu镜像的磁盘使用率为100%?

为什么docker报告新的ubuntu镜像的磁盘使用率为100%?

我无法再使用 docker 或有效地运行新镜像——它报告说我的磁盘使用率为 100%。在这里,您可以看到我正在启动 ubuntu 的原始副本,但它告诉我没有剩余磁盘空间:

$ docker run -t -i ubuntu /bin/bash
root@3838b70bd76e:/# df -h 
Filesystem      Size  Used Avail Use% Mounted on
rootfs           19G   18G     0 100% /
none             19G   18G     0 100% /
tmpfs          1005M     0 1005M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda1        19G   18G     0 100% /etc/hosts
tmpfs          1005M     0 1005M   0% /proc/kcore

另外,我尝试启动一个 mysql 实例,它向我发送了错误消息,我认为这些错误消息与我没有可用磁盘有关。当我尝试运行 orchardup/mysql 时,我收到:

ERROR: 1030  Got error 28 from storage engine

这意味着它的存储空间已经用完了。

鉴于此,我应该如何解释上述 df -h 报告,以及如何确定是什么消耗了 100% 的磁盘空间?我正在运行 docker 1.3,在 OSX 10.9.4 上运行,使用 boot2docker。

谢谢。


编辑:作为一种解决方法,我运行了boot2docker delete,然后运行了boot2docker init,它似乎已经破坏了我的所有图像(幸运的是我可以用我的docker文件)。现在,当我启动一个新的 Ubuntu 映像时:

root@f53d637e3d33:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs           19G  373M   17G   3% /
none             19G  373M   17G   3% /
tmpfs          1005M     0 1005M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda1        19G  373M   17G   3% /etc/hosts
tmpfs          1005M     0 1005M   0% /proc/kcore

好多了。但是,我仍然感到困惑,在 boot2docker 托管的所有镜像中一定存在某种共享的全局磁盘,而这些磁盘之前已经被填满了?


编辑 2:我刚刚下载了一堆图像,现在当我运行 ubuntu 图像并检查可用磁盘空间时看到的内容:

root@f53d637e3d33:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs           19G  2.7G   15G  16% /
none             19G  2.7G   15G  16% /
tmpfs          1005M     0 1005M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda1        19G  2.7G   15G  16% /etc/hosts
tmpfs          1005M     0 1005M   0% /proc/kcore

消耗量从 3% 到 16%!显然,我的所有图像之间存在某种我不理解的共享磁盘……

答案1

在 Windows 主机上,boot2docker 通过使用虚拟盒创建虚拟机来工作。当您运行 boot2docker init 时,它会创建一个虚拟机,并默认为根磁盘分配 20G。这个虚拟机运行一个最小的 Linux 操作系统,进而运行实际的 docker 守护程序(docker 守护程序尚未在 Windows 上本地运行)。

连接到虚拟机的磁盘为 docker 镜像提供了存储。因此,您可以查看 boot2docker init 命令的其他选项以增加初始磁盘大小。这将增加虚拟机中可用的磁盘大小,但正如 Queasy 指出的那样,您需要向 docker 守护程序添加附加选项以增加镜像的可用存储空间。

当您在容器中运行“df -h”时,报告的总磁盘大小是使用“dm.basesize”选项分配给 docker 守护进程的磁盘空间的大小。

注意:boot2docker 现已弃用,取而代之的是 Docker Toolbox。您可能希望升级到该版本,在这种情况下,您将使用“docker-machine create”而不是“boot2docker init”。我已切换到 docker-toolbox,因此无法测试 boot2docker init 所需的命令选项

答案2

修改 /etc/sysconfig/docker-storage 中的 docker 配置并添加以下行:

DOCKER_STORAGE_OPTIONS= --storage-opt dm.basesize=30G

在继续此任务之前请记住备份你的docker,因为它会在初始化后删除你的数据。

答案3

考虑一下硬盘可能有问题。日立 (Drive Fitness Test)、希捷 (Seatools) 和西部数据 (Western Digital Data Lifeguard) 都提供免费诊断软件来帮助您确定这一点。

举个例子,一个坏的驱动器会如何影响磁盘空间,我备份了 1TB 的驱动器,它们向 Windows 报告说它们仍然有PB 级剩余需要传输的数据。

如果您的驱动器没有问题,请使用 du(磁盘使用情况)查看哪个文件夹最大du -h /usr/bindu -h /var或者du -h /home/[username]/Downloads帮助查明哪个文件夹最大。

编辑:我看到您正在使用 OS X:您需要使用上面提到的 HDD 工具作为其可启动选项,或者使用免费的 Windows PE 之类的工具,然后您可以启动并运行这些工具。

答案4

devicemapper 是 docker 的默认存储引擎。它默认尝试在 /var/lib/docker 中预分配 100Gb。但并非所有空间都真正被使用,您可以在选项中对其进行配置。Docker 文档

相关内容