為什麼 docker 說我的容器磁碟未滿(QubesOS)?
為什麼一個小的 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/
但掛載到的可用磁碟空間/
與容器內報告的相同。user@coviz:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda3 9.6G 9.1G 17M 100% / none 9.6G 9.1G 17M 100% /usr/lib/modules devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.0G 0 1.0G 0% /dev/shm tmpfs 777M 17M 760M 3% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 776M 0 776M 0% /sys/fs/cgroup /dev/xvdb 20G 418M 20G 3% /rw tmpfs 32M 12K 32M 1% /run/user/1000 user@coviz:~$
解決方案是添加一個配置,將
/rw/config/qubes-bind-dirs.d/
docker dirs 綁定'/var/lib/docker
到. 這不僅實際上使 docker 容器能夠訪問 Qubes 更大的“私有儲存”,而且還使該儲存在重新啟動時保持不變。/etc/docker``/rw/
以上可以通過在您的 Debian 10 AppVM 上執行以下操作來實現:
sudo mkdir -p /usr/lib/qubes-bind-dirs.d sudo cat << EOF > /usr/lib/qubes-bind-dirs.d/50_user.conf binds+=( '/var/lib/docker' ) binds+=( '/etc/docker' ) binds+=( '/root/.docker' ) EOF
在舊版本的 QubesOS (< r4.0)
qubes-bind-dirs.d
上,/rw/config/
$$ 1 $$:sudo mkdir -p /rw/config/qubes-bind-dirs.d sudo cat << EOF > /rw/config/qubes-bind-dirs.d/50_user.conf binds+=( '/var/lib/docker' ) binds+=( '/etc/docker' ) binds+=( '/root/.docker' ) EOF
然後重新啟動 AppVM。當它恢復時,它將是這樣的:
root@coviz:~# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda3 9.6G 8.9G 217M 98% / none 9.6G 8.9G 217M 98% /usr/lib/modules devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.0G 0 1.0G 0% /dev/shm tmpfs 777M 17M 760M 3% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 776M 0 776M 0% /sys/fs/cgroup /dev/xvdb 20G 617M 20G 4% /rw tmpfs 32M 12K 32M 1% /run/user/1000 root@coviz:~# docker run --rm -it --entrypoint /bin/bash e4217af9b7c7 root@66766a23ca1b:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 20G 618M 20G 4% / tmpfs 64M 0 64M 0% /dev tmpfs 246M 0 246M 0% /sys/fs/cgroup /dev/xvdb 20G 618M 20G 4% /etc/hosts shm 64M 0 64M 0% /dev/shm tmpfs 274M 0 274M 0% /proc/asound tmpfs 274M 0 274M 0% /proc/acpi tmpfs 274M 0 274M 0% /proc/scsi tmpfs 274M 0 274M 0% /sys/firmware root@66766a23ca1b:/#