[Из песочницы] Что собой представляют образы Docker none:none?

Предлагаю вашему вниманию перевод статьи What are Docker none: none images? из блога Project Atomic.

Последние несколько дней я потратил на упражнения с образами Docker :. Чтобы объяснить, что они собой представляют, и что могут натворить, я пишу этот пост, в котором ставлю вопросы:


  1. Что собой представляют образы Docker :?
  2. Что собой представляют обособленные (dangling) образы ?
  3. Почему я вижу кучу образов :, когда делаю docker images -a?
  4. В чем разница между docker images и docker images -a?

Прежде чем я начну отвечать на вопросы, запомните, что есть два вида образов :: хорошие и плохие.


Хорошие образы :

Чтобы разобраться в них, нужно понять как работает файловая система образов Docker, и как организованы слои образов. В этом посте для примера будет использоваться образ Fedora. Демон Docker запущен на ноутбуке, и я собираюсь загрузить образ fedora из docker hub.

docker images

На этом скриншоте, docker images показывает fedora:latest, а docker images -a уже два образа fedora:latest и :. Если вы используете Docker, вы замечали что количество образов : растет экспоненциально числу загруженных образов.

Для чего нужны образы :? Чтобы понять это, нужно знать как организованы слои файловой системы Docker. Каждый образ docker состоит из слоев, и слои имеют родительские и дочерние связи с другими слоями. Все слои файловой системы docker по умолчанию хранятся в /var/lib/docker/graph. В терминологии Docker она называется графовой базой данных. В примере fedora:latest состоит из двух слоев, их можно найти в /var/lib/docker/graph.

docker graph

IMAGE ID соответствует слою в директории /var/lib/docker/graph. Когда вы делаете docker pull fedora, образ загружает один слой за раз. Сначала docker загружает слой 48ecf305d2cf и помечает его :, так как это лишь один из слоев образа fedora:latest. В терминологии Docker он называется промежуточным образом из за опции -a.

Далее Docker загружает слой ded7cd95e059 и помечает его fedora:latest. Образ fedora: latest состоит из этих двух слоев, формируя связь родителя и дочернего элемента.

parent child

Для проверки существования родительско-дочерней связи мы можем проверить JSON файл слоя ded7cd95e059.

parent JSON

Все верно! Теперь мы поняли что значат образы :. Это промежуточные образы, которые могут быть увидены с использованием docker images -a. Они не приводят к переполнению жесткого диска, но занимают много места в выводе команды. И довольно сложно понять к чему они относятся.

Мы ответили на (1), (3) и (4). Давайте прольем свет на (2).


Плохие :

Другие образы : это обособленные образы, которые могут переполнить жесткий диск.

В языках программирования Java и Golang обособленный блок памяти, это блок без ссылок из любого места в коде. Система сборки мусора таких языков периодически помечает блоки обособленными и возвращает их в кучу, после этого эти блоки доступны для будущего использования. Подобно им, обособленный слой файловой системы Docker это что-то неиспользуемое и не имеющее ссылок из любых образов. Следовательно, нам нужен способ указать Docker очищать эти обособленные образы.

Мы уже знаем что значит : в docker images -a. Выше сказано что это промежуточные образы. Тем не менее при отсутствии образов : в выводе docker images, есть промежуточные образы, доступные для очистки. Откуда они берутся?

Эти промежуточные образы — результаты работы команд docker build или pull. В качестве конкретного примера,

Давайте соберем образ hello_world используя наш загруженный ранее базовый образ fedora. Мы соберем образ hello_world используя Dockerfile.

hello world

Как показано на верхнем скриншоте, мы успешно собрали образ hello_world используя Dockerfile.

Прошло время после сборки образа hello_world, и вышла новая версия Fedora. Давайте скачаем новый образ Fedora.

new fedora

Я получил новый образ Fedora. Теперь я хочу собрать образ hello_world с новой Fedora. Давайте соберем образ снова с тем же Dockerfile.

dangling

Если вы отвлечетесь и проверите, старый образ Fedora имеет IMAGE ID (ded7cd95e059), а новый образ Fedora со скриншота выше имеет IMAGE ID (5c6d07393f9f), это значит что образ Fedora был успешно обновлен. Важная вещь, которую нужно отметить на верхнем скриншоте это образ :.

Если вы помните, образы : указанные в docker images -a это промежуточные (хорошие) образы, но этот образ : является обычным образом docker. Это обособленный образ и должен быть очищен. Когда образ hello_world пересобрали используя Dockerfile, его ссылка на старую Fedora стала неотмеченной и обособленной.

Эта команда может быть использована для очистки обособленных образов.

docker rmi $(docker images -f "dangling=true" -q)

Сейчас Docker не имеет автоматической системы сборки мусора. Будет круто иметь такую. А пока что эта команда может использоваться для ручной сборки мусора.

© Habrahabr.ru