为什么一个小的 docker 镜像上的新容器说它的磁盘已满 10G 而不是?
我在 QubesOS 的 Debian 10 AppVM 中运行它。在 Debian 10 中,我这样做:
sudo apt-get -y install docker.io
sudo docker pull node:13-buster-slim
在撰写本文时,这给了我 docker v18.09.1 默认使用“overlay2”存储驱动程序。
root@coviz:~# sudo docker --version
Docker version 18.09.1, build 4c52b90
root@coviz:~# docker info | grep Storage
Storage Driver: overlay2
root@coviz:~#
我的 docker 主机现在只有这个 181M 的 docker 镜像,没有容器。docker 主机只使用了 20G 中的 0.5G。大量的自由空间。
root@coviz:~# sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@coviz:~# sudo docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
node 13-buster-slim e4217af9b7c7 9 days ago 181MB
root@coviz:~# sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 180.7MB 180.7MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
root@coviz:~#
我正在为我的项目创建一个 Dockerfile,因此我执行以下命令以从上述基本映像启动一个新容器并将我放入该临时容器的外壳中
root@coviz:~# docker run --rm -it --entrypoint /bin/bash e4217af9b7c7
root@97a318c599ab:/#
不久之后,我在测试安装依赖项的命令时遇到了问题apt-get
。我认为问题在于 apt 需要将缓存数据存储到/var/lib/apt/lists/
. 实际错误是at least one invalid signature was encountered
,但实际上似乎是磁盘填充问题(apt 密钥验证失败,因为它无法将签名存储到磁盘)。运行 anapt-clean
无济于事;它已经是空的了。这是一个基于新镜像的新容器。
在这个新容器中检查磁盘df
立即显示只有 17M 的可用磁盘空间,但我只能用du
. 同样,这是一个新容器,所以我非常怀疑这是一个文件卡在“删除”状态仍由进程打开的问题。
root@97a318c599ab:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 9.6G 9.1G 17M 100% /
tmpfs 64M 0 64M 0% /dev
tmpfs 255M 0 255M 0% /sys/fs/cgroup
/dev/xvda3 9.6G 9.1G 17M 100% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 285M 0 285M 0% /proc/asound
tmpfs 285M 0 285M 0% /proc/acpi
tmpfs 285M 0 285M 0% /proc/scsi
tmpfs 285M 0 285M 0% /sys/firmware
root@97a318c599ab:/# du -sh /*
4.8M /bin
4.0K /boot
0 /dev
612K /etc
20K /home
12M /lib
4.0K /lib64
4.0K /media
4.0K /mnt
5.2M /opt
du: cannot access '/proc/11/task/11/fd/4': No such file or directory
du: cannot access '/proc/11/task/11/fdinfo/4': No such file or directory
du: cannot access '/proc/11/fd/4': No such file or directory
du: cannot access '/proc/11/fdinfo/4': No such file or directory
0 /proc
136K /root
8.0K /run
4.1M /sbin
4.0K /srv
0 /sys
2.2M /tmp
160M /usr
5.9M /var
root@97a318c599ab:/#
此外,docker ps -s
显示我的容器上的“可写层”的大小为空(0B
):
root@coviz:~# docker ps -a -s
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
320af1498086 e4217af9b7c7 "docker-entrypoint.s…" 15 minutes ago Up 15 minutes epic_leakey 0B (virtual 181MB)
root@coviz:~#
那么为什么这个新的 docker 容器的磁盘(基于约 200M 的图像)已满?是什么占用了大约 9G 的未计算空间?
这是 QubesOS 还为 AppVM 分层磁盘空间的方式的一个问题。
这是 docker 主机(Debian 10 AppVM)上的磁盘空间。请注意,它有 20G 的可用磁盘空间,
/rw/
但挂载到的可用磁盘空间/
与容器内报告的相同。解决方案是添加一个配置,将
/rw/config/qubes-bind-dirs.d/
docker dirs 绑定'/var/lib/docker
到. 这不仅实际上使 docker 容器能够访问 Qubes 更大的“私有存储”,而且还使该存储在重新启动时保持不变。/etc/docker
/rw/
以上可以通过在您的 Debian 10 AppVM 上执行以下操作来实现:
在旧版本的 QubesOS (< r4.0) 上,
qubes-bind-dirs.d
位于/rw/config/
[1]中:然后重新启动 AppVM。当它恢复时,它将是这样的: