如何修复 OpenSUSE Docker 安装未使用所有可用存储

如何修复 OpenSUSE Docker 安装未使用所有可用存储

过去几天,我一直在拼命解决各种问题,包括不断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/到新文件夹)。
  • 另一个可能的解决方案是增加根分区的大小。

这些修复方法按从最简单但最糟糕到最困难但最好的顺序列出。无论你做什么,都要小心,备份你的数据!当摆弄这些东西时,很容易意外删除重要的文件。

相关内容