Как создать большой образ докера с относительно небольшим потреблением дискового пространства?

Фон

Я пытаюсь создать образ докера из Dockerfile на виртуальной машине. Виртуальная машина работает под управлением Redhat 7.1 (ядро 3.10) и Docker 1.10.2.

Dockerfile имеет следующий контент

FROM rhel
MAINTAINER MyName<[email protected]>
RUN #yum install wget and other tools (less than 500 MB)
COPY entitlementfile /opt/entitlementfile
RUN  wget -O /opt/installer.bin https://installer.com/installer.bin \ 
    && chmod +x /opt/* \
    && /opt/installer.bin --quiet \
    && rm -f /opt/*.bin
USER admin

На моей виртуальной машине сборки доступно около 16 ГБ свободного места.

[root@xrh701 DockerImage]# df -h
Filesystem                                        Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root                              18G  2.1G   16G  12% /
...

Установщик работает в диапазоне 3G, а установленный пакет — в диапазоне 8G. Это в сумме составляет максимум 11 ГБ, что немного превышает размер базового устройства докера по умолчанию, который составляет 10 ГБ.

Поэтому я вручную запускаю демон docker с большим dm.size (15G), чтобы обойти эту проблему.

docker daemon --storage-opt dm.basesize=15G

Поскольку докер основан на Union FS, образы накладываются друг на друга. Так что я понимаю, что

(1) максимальный размер, который мог получить мой образ, составляет 11 ГБ (установщик в один слой 3 ГБ, а слой пакета, добавленный поверх 8 ГБ)

(2) и если я wget установщик, запускаю его, затем удаляю установщик той же командой RUN, образ должен быть только 8G (так как установщик 3G удаляется)

В любом случае, суть в том, что 16G места должно быть более чем достаточно.

Проблема

Но мое текущее наблюдение заключается в том, что во время процесса сборки докера он всегда зависал, так как использовал все доступные места.

[root@xrh701 DockerImage]# df -h
Filesystem                                        Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root                              18G   18G   20K 100% /
...

я вижу две картинки

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              fa09e98656ba        About an hour ago   258.1 MB
rhel                latest              32f8a1d5f019        9 days ago          203.2 MB

«docker inspect» показывает, что изображение ‹ none > является промежуточным изображением после COPY файла прав.

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS               NAMES
232245023f90        fa09e98656ba        "/bin/sh -c 'wget -O "   About an hour ago   Exited (0) About an hour ago                       lonely_curie

Этот промежуточный контейнер завершил строку RUN wget, успешно завершил работу, но не зафиксировал образ докера из-за нехватки места.

Что еще хуже, я не могу ни удалить контейнер, ни удалить /var/lib/docker, чтобы восстановить место обратно

# docker rm -f lonely_curie
Failed to remove container (lonely_curie): Error response from daemon: Driver devicemapper failed to remove root filesystem 232245023f90b42a4dbd19a78bf32836f9f8618d7dbcba54159c3df029b5b114: mount still active

Вопрос

  1. Почему докер израсходовал все пространство? Согласно расчетам, места на диске (16G) должно быть более чем достаточно для целевого образа (8G). [Эта виртуальная машина принадлежит мне, поэтому я могу гарантировать, что никто другой или какой-либо другой процесс не использует место на жестком диске]

  2. Как принудительно удалить контейнер в моей текущей ситуации, чтобы восстановить пространство?

  3. Как мне собрать этот образ 8G (или образ 11G, если считать установщик) на виртуальной машине 16G? Если это невозможно, каково минимальное пространство для его успешного создания? В настоящее время я подаю заявку на виртуальную машину 32G из лаборатории.


person cookieisaac    schedule 10.03.2016    source источник
comment
Хм, кажется, одинокий_кюри удален, так как я больше не вижу его в docker ps -a... но я все еще не могу удалить /var/lib/docker, так как он все еще жалуется, что устройство и ресурс заняты   -  person cookieisaac    schedule 11.03.2016


Ответы (1)


TL;DR

Предположим, что установщик — 3G, а установленный пакет — 8G.

Если я выпущу Dokcerfile, то минимальное требование к диску будет не менее 22 ГБ [ (3+8)*2 = 22 ] для создания этого образа.

Если я выпущу образ и отправлю его в Dockerhub, то пользователю потребуется всего 11 G, чтобы извлечь образ и запустить контейнер на его основе.

==================================================================

Создать

Я получил машину размером около 50G для повторного запуска сборки и мониторинга использования диска.

Перед началом сборки

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root   59G   6G   53G  9% /
...

После завершения установки

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root   59G   19G   38G  34% /
...

После фиксации изображения

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root   59G   27G   30G  48% /
...

Итак, чтобы ответить на мой собственный вопрос: (1) Он израсходовал весь диск, потому что для этого требуется как минимум столько места на диске. Предыдущий расчет предполагал, что работающий контейнер и создаваемый образ будут использовать один и тот же слой.

(2) С этой частью еще не разобрался. Прямо сейчас я просто выбрасываю виртуальную машину и позволяю вернуть ее.

(3) Минимальный требуемый диск будет (3G + 8G) * 2 = 22 G. Поэтому я предполагаю, что для дальнейшего использования я должен зарезервировать вдвое больше теоретически рассчитанного размера изображения, так как слой кажется копируемым, а не общим при фиксации работающего контейнера в образе. [Сборка Dockerfile по существу аналогична ручному запуску контейнера и фиксации образа.]

=================================================================

Выполнить

И в дополнение, после того, как я зафиксирую образ и удалю контейнер, диск можно будет восстановить.

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root   59G   15G   42G  26% /
....

И с этого момента запуск работающего контейнера не будет увеличивать потребление диска (значительно).

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-lv_root   59G   15G   42G  26% /
...
person cookieisaac    schedule 15.03.2016