Назад | Перейти на главную страницу

Почему докер говорит, что диск моего контейнера заполнен, когда это не так (QubesOS)?

Почему новый контейнер на маленьком образе докера говорит, что его диск заполнен 10 ГБ, а это не так?

Я запускаю это в Debian 10 AppVM в QubesOS. В 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:~# 

У моего хоста докеров теперь есть только этот образ докера 181M без контейнеров. Хост-докер использует только 0,5 ГБ из доступных 20 ГБ. Много свободного места.

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 не выполняется, потому что не удается сохранить подпись на диске). Запуск apt-clean не помогает; он уже пуст. Это свежая тара на основе свежего образа.

Проверка диска с помощью df в этом новом контейнере сразу показывает, что доступно только 17 МБ дискового пространства, но я могу учитывать только ~ 200 МБ с 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:~# 

Так почему же диск этого нового док-контейнера (на основе образа размером ~ 200 МБ) заполнен? Что занимает эти ~ 9 ГБ неучтенного пространства?

Это проблема, связанная с тем, как QubesOS также размещает свое дисковое пространство для AppVM.

Это было дисковое пространство на хосте докеров (Debian 10 AppVM). Обратите внимание, что его 20 ГБ свободного дискового пространства находятся в /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/ это связывает докеры '/var/lib/docker и /etc/docker в /rw/. Это не только фактически дает контейнерам докеров доступ к большему «частному хранилищу» Qubes, но также делает это хранилище постоянным при перезагрузках.

Вышесказанное может быть достигнуто, выполнив следующее на вашей Debian 10 AppVM:

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' )
EOF

В Qubes> = r4.0 qubes-bind-dirs. переехал из /rw/config/ к /usr/lib/ [1]:

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' )
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:/#