docker 磁盘 space 比容器的增长更快

docker disk space grows faster than container's

Docker 大量修改文件、添加和删除 (leveldb) 的容器正在以比容器本身报告更快的速度增长磁盘使用率,并最终耗尽所有磁盘。

这是 df 的一张快照,还有一张。您会注意到,从主机的角度来看,磁盘 space 已显着增加(300 兆字节),但容器自我报告的磁盘 space 使用情况仅增加了 17 兆字节。随着这种情况的继续,主机用完了磁盘。

Ubuntu 库存 14.04,Docker 版本 1.10.2,构建 c3959b1。

这里是否发生了类似 trim 的问题?

    root@9e7a93cbcb02:~# df -h
    Filesystem                                              Size  Used Avail Use% Mounted on          
    /dev/mapper/docker-202:1-136171-d4[...]                 9.8G  667M  8.6G   8% /
    tmpfs                                                   1.9G     0  1.9G   0% /dev                
    tmpfs                                                   1.9G     0  1.9G   0% /sys/fs/cgroup      
    /dev/disk/by-uuid/0a76513a-37fc-43df-9833-34f8f9598ada  7.8G  2.9G  4.5G  39% /etc/hosts          
    shm                                                     64M     0   64M   0% /dev/shm        

之后:

    root@9e7a93cbcb02:~# df -h
    Filesystem                                              Size  Used Avail Use% Mounted on          
    /dev/mapper/docker-202:1-136171-d4[...]                 9.8G  684M  8.6G   8% /
    tmpfs                                                   1.9G     0  1.9G   0% /dev                
    tmpfs                                                   1.9G     0  1.9G   0% /sys/fs/cgroup      
    /dev/disk/by-uuid/0a76513a-37fc-43df-9833-34f8f9598ada  7.8G  3.2G  4.2G  43% /etc/hosts          
    shm                                                     64M     0   64M   0% /dev/shm              

发生这种情况是因为内核错误修复尚未传播到许多主流 OS 发行版。对于像我一样天真地在默认 Amazon AMI 上启动 docker 的新手 Docker 用户来说,这实际上是非常糟糕的。

坚持使用 CoreOS 稳定版,您不会遇到这个问题。我与 CoreOS 的关系为零,坦率地说,我对不得不处理 Yet Another Distro 感到非常恼火。在 CoreOS 发行版或其他正常工作的 linux 内核中,当容器释放或使用 space 时,容器和主机的磁盘 space 相互正确上下跟踪。我会注意到 OSX 或其他虚拟盒发行版使用 CoreOS,因此可以正常工作。

Here's a long writeup on a very similar issue,但根本原因是 devicemapper 中的 trim/discard 问题。您需要相当新版本的 Linux 内核才能正确处理此问题。我什至会说 Docker 不符合目的,除非你有正确的 Linux 内核。请参阅该文章,了解有关使用哪个发行版版本的讨论。

请注意,以上文章仅涉及 docker 容器和映像的管理,但据我所知,它还会影响容器本身在正常 addition/removal 期间尝试释放磁盘 space文件或块。

注意您的云提供商使用什么发行版进行云容器管理。