Docker磁盘空间不足

3

我有这个Docker命令:

docker run -d mongo

这将构建并运行在Docker容器中运行的MongoDB服务器。
然而,我遇到了一个错误:
no space left on device

我在MacOS上使用较新版本的Docker,它使用hyper-v而不是VirtualBox(我认为这是正确的)。以下是来自容器的错误消息:
$ docker logs efee16702c5756659d563b98d4ae0f58ecf1f1bba8a54f63443c0ae4b520ab4e
about to fork child process, waiting until server is ready for connections.
forked process: 21
2017-05-04T20:23:51.412+0000 I CONTROL  [main] ***** SERVER RESTARTED *****
2017-05-04T20:23:51.430+0000 I CONTROL  [main] ERROR: Cannot write pid file to /tmp/tmp.Lo035QkbfL: No space left on device
ERROR: child process failed, exited with error number 1

有什么办法可以修复这个问题并防止将来发生?

如建议所述,df -h 的输出为:

Filesystem      Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk1     465Gi  116Gi  349Gi    25% 1963838 4293003441    0%   /
devfs          183Ki  183Ki    0Bi   100%     634          0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%       0          0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%       0          0  100%   /home

docker info 的输出如下:

$ docker info
    Containers: 5
     Running: 0
     Paused: 0
     Stopped: 5
    Images: 741
    Server Version: 17.03.1-ce
    Storage Driver: overlay2
     Backing Filesystem: extfs
     Supports d_type: true
     Native Overlay Diff: true
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Plugins: 
     Volume: local
     Network: bridge host ipvlan macvlan null overlay
    Swarm: inactive
    Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
    runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
    init version: N/A (expected: 949e6facb77383876aeff8a6944dde66b3089574)
    Security Options:
     seccomp
      Profile: default
    Kernel Version: 4.9.13-moby
    Operating System: Alpine Linux v3.5
    OSType: linux
    Architecture: x86_64
    CPUs: 4
    Total Memory: 1.952 GiB
    Name: moby
    ID: OR4L:WYWW:FFAP:IDX3:B6UK:O2AN:UVTO:EPH6:GYSV:4GV4:L5WP:BQTH
    Docker Root Dir: /var/lib/docker
    Debug Mode (client): false
    Debug Mode (server): true
     File Descriptors: 17
     Goroutines: 30
     System Time: 2017-05-04T20:45:27.056157913Z
     EventsListeners: 1
    No Proxy: *.local, 169.254/16
    Registry: https://index.docker.io/v1/
    Experimental: true
    Insecure Registries:
     127.0.0.0/8
    Live Restore Enabled: false

正在使用哪个存储驱动程序?运行 docker info | grep Storage。主机上是否有可用空间?运行 df -h - Ricardo Branco
存储驱动程序:overlay2 - Alexander Mills
df -h 的输出有问题。 - Alexander Mills
1
由于您使用的是Mac系统,能否发布以下命令的输出结果:ls -altrh Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 - Kevin Kopf
1
抱歉,它在 ~/Library/.... 目录下。 - Kevin Kopf
显示剩余15条评论
1个回答

3

根据您在问题评论中的说明,ls -altrh ~/Library/Containers/com.docker.docker/Data/com.docker.driver.‌​amd64-linux/Docker.q‌​cow2 返回以下结果:

-rw-r--r--@ 1 alexamil staff 53G

这是MacOS(实际上不只是它)已知的一个bug,可以在这里找到官方开发者的评论。但有一点要注意:我看到不同的人有不同的大小限制。在评论中是64Gb,但对于另一个人则是20Gb。
有几种方法可以解决这个问题,但我没有找到明确的解决方案。

手动删除

运行docker ps -a并手动删除所有未使用的容器。然后运行docker images并手动删除所有中间和未使用的镜像。

最简单的方法

完全删除Docker.qcow2文件。但您将彻底失去所有镜像和容器。

较为复杂的方法

另一种方法是运行docker volume prune,它将删除所有未使用的卷

调整大小(保留数据)

另一个想法是使用QEMU或类似工具扩展磁盘映像大小。
$ brew install qemu
$ /Applications/Docker.app/Contents/MacOS/qemu-img resize ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 +5G

扩展镜像后,您需要运行一个虚拟机,在其中运行GParted来调整Docker.qcow2的分区并使用新增的空间。您可以使用GParted Live ISO来执行此操作:

$ qemu-system-x86_64 -drive file=Docker.qcow2  -m 512 -cdrom ~/Downloads/gparted-live.iso -boot d -device usb-mouse -usb

有些人报告说这个方法不起作用或没有帮助。

另一种调整大小的方法(将数据擦除)

创建一个所需尺寸(120G)的替代图像:

$ qemu-img create -f qcow2 ~/data.qcow2 120G
$ cp ~/data.qcow2 /Application/Docker.app/Contents/Resources/moby/data.qcow2
$ rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 

当您重新启动Docker时,data.qcow2将被复制到~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

这个解决方法来自这条评论

希望这可以帮到您。祝好运!


谢谢,明天会看一下,看起来是一些有用的信息。 - Alexander Mills
我认为你只需要执行 docker prune image 命令来删除所有悬空的镜像,以及执行 docker prune container 命令来移除所有已退出的容器。 - Bill Cheng

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