Debian

為什麼 docker 說我的容器磁碟未滿(QubesOS)?

  • September 29, 2020

為什麼一個小的 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 &lt;&lt; EOF &gt; /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:/# 

引用自:https://serverfault.com/questions/1011579