过去几天,我一直在拼命解决各种问题,包括不断no space left on device
出现错误、容器出现故障(当它们需要使用更多磁盘空间时)以及似乎缺乏存储空间的一般问题。问题是,我已经数百可用的 GB 存储空间,以及足够多的 inode。另外值得注意的是,在修复另一个类似问题后,我在运行非 Docker 命令和进程时不再遇到这些错误和问题。
通过摆弄 Docker 安装,我得到的印象是 Docker 对其自身施加了某种存储限制(似乎大约为 40 GB?),因为清理 Docker 安装可以暂时解决问题,但是当添加更多图像/容器/等时,问题会再次出现。
以下是输出df -h
:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 18G 0 18G 0% /dev
tmpfs 18G 0 18G 0% /dev/shm
tmpfs 18G 26M 18G 1% /run
tmpfs 18G 0 18G 0% /sys/fs/cgroup
/dev/sda1 40G 39G 680M 99% /
/dev/sda1 40G 39G 680M 99% /tmp
/dev/sda1 40G 39G 680M 99% /usr/local
/dev/sda1 40G 39G 680M 99% /.snapshots
/dev/sda1 40G 39G 680M 99% /root
/dev/sda1 40G 39G 680M 99% /opt
/dev/sda1 40G 39G 680M 99% /srv
/dev/sda1 40G 39G 680M 99% /var
/dev/sda1 40G 39G 680M 99% /boot/grub2/x86_64-efi
/dev/sda1 40G 39G 680M 99% /boot/grub2/i386-pc
/dev/sda3 390G 430M 389G 1% /home
shm 64M 0 64M 0% /var/lib/docker/containers/0735e91a5a94abd2d35e8724d497b7b17fd47d961cd3675530b649e2ef41a994/shm
shm 64M 0 64M 0% /var/lib/docker/containers/d7872bfc37a924c01467a968d50b90ebf67f399f063cef19ec63da575c25e3bd/shm
shm 64M 0 64M 0% /var/lib/docker/containers/c268324c566fb3c2ca0c35cd9ffdc2098091b85ef562edc8cac1a526558cd915/shm
shm 64M 0 64M 0% /var/lib/docker/containers/428a97e7b27af2ce4993958d079f9fc5213826711e1230915085d78d4999d55f/shm
shm 64M 0 64M 0% /var/lib/docker/containers/971137d0c07e59f5ffec7f1b05526140f63a936b717a4a01010c59d54bc2489d/shm
shm 64M 0 64M 0% /var/lib/docker/containers/bb68ed0847455de5860a240b34d6deb33d6644437a763d0b4592232e136f880e/shm
shm 64M 0 64M 0% /var/lib/docker/containers/e91e711f21597aa8523c1132bd19ab977657d4a830810dd636945ff7214b3224/shm
shm 64M 0 64M 0% /var/lib/docker/containers/5349e122ee53da19fb654d126a10cc1a2db82e80be81afa158be0fd101e33d83/shm
shm 64M 64K 64M 1% /var/lib/docker/containers/9ff03bb3c21e6b77b24a94207213e6cfd3f4b2a96d5a4e06c117119ffe417719/shm
shm 64M 0 64M 0% /var/lib/docker/containers/f677ee4c43a1ddc4a70fdc37de1e600cc2dfa090be8237f76bad9f8731dd109b/shm
tmpfs 3.6G 0 3.6G 0% /run/user/0
shm 64M 0 64M 0% /var/lib/docker/containers/e650b70591ba2e7a4096fe64920d249493db2e45fccec2918f2f41dc2b153fc8/shm
shm 64M 0 64M 0% /var/lib/docker/containers/652bd601b42071ce80149d53950fe37f5ebe5457b7dade9195d51867662307fd/shm
以下是输出docker info
:
Containers: 14
Running: 12
Paused: 0
Stopped: 2
Images: 13
Server Version: 17.09.1-ce
Storage Driver: btrfs
Build Version: Btrfs v4.15
Library Version: 102
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: oci runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0
runc version: 3f2f8b84a77f73d38244dd690525642a72156c64
init version: v0.1.3_catatonit (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.12.14-lp150.11-default
Operating System: openSUSE Leap 15.0
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 35.34GiB
Name: server-PowerEdge-2900
ID: I7RS:QXXH:TCXR:S55J:ANEW:ESA4:MLWL:FXQ5:TNKX:NY5O:B3GZ:GGGG
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: phyremaster
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
答案1
事实证明,对此的解释实际上非常简单;我很惊讶互联网上完全没有这个问题的答案。
基本上,默认情况下,Docker 使用/var/lib/docker/
来存储所有容器、图像和卷。在许多情况下,这很好。但是,如果您拥有大量卷,则可能会遇到问题。为什么?在大多数 Linux 发行版(包括 OpenSUSE)中,绝大多数可用磁盘空间都专门分配给分区/home
,只留下(在我的情况下)大约 40 GB 用于其他文件夹中的文件,包括/var/lib/docker/
。我的 Docker 安装曾是实际上是空间不足,但不是磁盘空间不足;是分割空间。
尽管如此,还有一个重要的问题:如何解决这个问题?有很多选择:
- 就我个人而言,我决定将每个卷文件夹的内容复制
_data
到我的主文件夹内的新文件夹中,然后将我的所有容器的卷更改为新文件夹的绑定挂载。 - 或者,您可以编辑 Docker 安装的配置,将主存储位置更改为主
/var/lib/docker/
目录中的文件夹(确保将内容复制/var/lib/docker/
到新文件夹)。 - 另一个可能的解决方案是增加根分区的大小。
这些修复方法按从最简单但最糟糕到最困难但最好的顺序列出。无论你做什么,都要小心,备份你的数据!当摆弄这些东西时,很容易意外删除重要的文件。