Docker 说“设备上没有剩余空间”但是,系统有足够的空间吗?

dou*_*BTV 23 fedora hard-disk docker

我正在尝试运行一个可在其他系统上运行的 docker 映像(如果您愿意,您甚至可以从 dockerhub 中提取它:它是dougbtv/asterisk)但是,在我的通用工作站上,它在抱怨可用空间(看起来像)它正在解压 docker 图像。

我尝试运行它,当我运行它时,我收到一个错误,指出它空间不足。这是我尝试运行它的一个例子,它抱怨空间。

[root@localhost docker]# docker run -i -t dougbtv/asterisk /bin/bash
Timestamp: 2015-05-13 07:50:58.128736228 -0400 EDT
Code: System error

Message: [/usr/bin/tar -xf /var/lib/docker/tmp/70c178005ccd9cc5373faa8ff0ff9c7c7a4cf0284bd9f65bbbcc2c0d96e8565d410879741/_tmp.tar -C /var/lib/docker/devicemapper/mnt/70c178005ccd9cc5373faa8ff0ff9c7c7a4cf0284bd9f65bbbcc2c0d96e8565d/rootfs/tmp .] failed: /usr/bin/tar: ./asterisk/utils/astdb2sqlite3: Wrote only 512 of 10240 bytes
/usr/bin/tar: ./asterisk/utils/conf2ael.c: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/astcanary: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/.astcanary.o.d: Cannot write: No space left on device
/usr/bin/tar: ./asterisk/utils/check_expr.c: Cannot write: No space left on device
[... another few hundred similar lines]
Run Code Online (Sandbox Code Playgroud)

当然,我会检查有多少可用空间,通过谷歌搜索,我发现有时会发生这种情况是因为您的 inode 不足。所以我看了一下两者,我可以看到还有很多 inode。

[root@localhost docker]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G   20M  3.9G   1% /dev/shm
tmpfs                    3.9G  1.2M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/fedora-root   36G  9.4G   25G  28% /
tmpfs                    3.9G  5.2M  3.9G   1% /tmp
/dev/sda3                477M  164M  285M  37% /boot
/dev/mapper/fedora-home   18G  7.7G  8.9G  47% /home
tmpfs                    793M   40K  793M   1% /run/user/1000
/dev/sdb1                489G  225G  265G  46% /mnt/extradoze
[root@localhost docker]# df -i
Filesystem                 Inodes  IUsed     IFree IUse% Mounted on
devtmpfs                  1012063    585   1011478    1% /dev
tmpfs                     1015038     97   1014941    1% /dev/shm
tmpfs                     1015038    771   1014267    1% /run
tmpfs                     1015038     15   1015023    1% /sys/fs/cgroup
/dev/mapper/fedora-root   2392064 165351   2226713    7% /
tmpfs                     1015038    141   1014897    1% /tmp
/dev/sda3                  128016    429    127587    1% /boot
/dev/mapper/fedora-home   1166880 145777   1021103   13% /home
tmpfs                     1015038     39   1014999    1% /run/user/1000
/dev/sdb1               277252836 168000 277084836    1% /mnt/extradoze
Run Code Online (Sandbox Code Playgroud)

所以你可以看到这里发生的事情是我的 /etc/fstab

[root@localhost docker]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Tue Mar 17 20:11:16 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/fedora-root /                       ext4    defaults        1 1
UUID=2e2535da-907a-44ec-93d8-1baa73fb6696 /boot                   ext4    defaults        1 2
/dev/mapper/fedora-home /home                   ext4    defaults        1 2
/dev/mapper/fedora-swap swap                    swap    defaults        0 0
Run Code Online (Sandbox Code Playgroud)

而且我还问了一个有类似堆栈交换问题的人询问lvs命令的结果,其中显示:

[root@localhost docker]# lvs
  LV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home fedora -wi-ao---- 17.79g                                                    
  root fedora -wi-ao---- 36.45g                                                    
  swap fedora -wi-ao----  7.77g         
Run Code Online (Sandbox Code Playgroud)

这是一个 Fedora 21 系统:

[root@localhost docker]# cat /etc/redhat-release 
Fedora release 21 (Twenty One)
[root@localhost docker]# uname -a
Linux localhost.localdomain 3.19.5-200.fc21.x86_64 #1 SMP Mon Apr 20 19:51:56 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

存储驱动程序:

[doug@localhost cs]$ sudo docker info|grep Driver:
Storage Driver: devicemapper
Execution Driver: native-0.2
Run Code Online (Sandbox Code Playgroud)

码头工人版本:

[doug@localhost cs]$ sudo docker -v
Docker version 1.6.0, build 3eac457/1.6.0
Run Code Online (Sandbox Code Playgroud)

根据这篇推荐的文章,我尝试将 docker 更改为/etc/sysconfig/docker

OPTIONS='--selinux-enabled --storage-opt dm.loopdatasize=500GB --storage-opt dm.loopmetadatasize=10GB'
Run Code Online (Sandbox Code Playgroud)

并重新启动docker,无济于事。我已经把它改回了--selinux-enabled(注意:我禁用了 selinux)

另外我注意到文章提到查看备用数据文件,它看起来像:

[root@localhost doug]# ls -alhs /var/lib/docker/devicemapper/devicemapper
total 3.4G
4.0K drwx------ 2 root root 4.0K Mar 20 13:37 .
4.0K drwx------ 5 root root 4.0K Mar 20 13:39 ..
3.4G -rw------- 1 root root 100G May 13 14:33 data
9.7M -rw------- 1 root root 2.0G May 13 14:33 metadata
Run Code Online (Sandbox Code Playgroud)

稀疏文件大于磁盘大小是不是有问题?

我的lsblk样子:

[root@localhost doug]# lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                           8:0    0 111.8G  0 disk 
??sda1                        8:1    0   100M  0 part 
??sda2                        8:2    0  49.2G  0 part 
??sda3                        8:3    0   500M  0 part /boot
??sda4                        8:4    0     1K  0 part 
??sda5                        8:5    0    62G  0 part 
  ??fedora-swap             253:0    0   7.8G  0 lvm  [SWAP]
  ??fedora-root             253:1    0  36.5G  0 lvm  /
  ??fedora-home             253:2    0  17.8G  0 lvm  /home
sdb                           8:16   0   1.8T  0 disk 
??sdb1                        8:17   0   489G  0 part /mnt/extradoze
loop0                         7:0    0   100G  0 loop 
??docker-253:1-1051064-pool 253:3    0   100G  0 dm   
loop1                         7:1    0     2G  0 loop 
??docker-253:1-1051064-pool 253:3    0   100G  0 dm   
Run Code Online (Sandbox Code Playgroud)

小智 16

如果您使用任何基于 Red-Hat 的操作系统,您应该知道“Devicemapper”限制为每个映像 10 GB,如果您尝试运行最大 10 GB 的映像,您可能会收到该错误。那可能是你的问题。试试这个,它对我有用

https://docs.docker.com/engine/reference/commandline/daemon/#storage-driver-options

 sudo systemctl stop docker.service
Run Code Online (Sandbox Code Playgroud)

或者

sudo service docker stop

rm -rvf /var/lib/docker (Take back up of any important data; containers and images will be deleted)
Run Code Online (Sandbox Code Playgroud)

运行这个命令

docker daemon --storage-opt dm.basesize=20G
Run Code Online (Sandbox Code Playgroud)

其中“20G”是指您希望devicemapper采用的新大小,然后重新启动docker

sudo systemctl start docker.service
Run Code Online (Sandbox Code Playgroud)

或者

sudo service docker start
Run Code Online (Sandbox Code Playgroud)

检查它是否通过运行设置

docker info
Run Code Online (Sandbox Code Playgroud)

希望这有效!

  • 命令 `docker daemon --storage-opt dm.basesize=20G` 似乎不再存在。 (2认同)
  • `docker daemon` 现在只是 `dockerd` (2认同)

小智 4

您是否有机会尝试运行非常大的图像?RHEL 没有 aufs 本机支持。因此,devicemapper 当您使用 时devicemapper,默认情况下您只能访问容器文件系统的 10GB。看看这篇文章,可能会有帮助。

  • 虽然此链接可以回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。 (4认同)