Що собою представляють образи Docker none:none?

Пропоную вашій увазі переклад статті What are Docker none:none images? з блогу Project Atomic.
Останні кілька днів я витратив на вправи з образами Docker
<none>:<none>
. Щоб пояснити, що вони собою являють і що можуть накоїти, я пишу цей пост, в якому ставлю питання:
  1. Що собою представляють образи Docker
    <none>:<none>
    ?
  2. Що являють собою відособлені (dangling) образи ?
  3. Чому я бачу купу образів
    <none>:<none>
    , коли роблю
    docker images -a
    ?
  4. У чому різниця між
    docker images
    та
    docker images -a
    ?
Перш ніж я почну відповідати на питання, запам'ятайте, що є два види образів
<none>:<none>
: хороші і погані.
Гарні образи <none>:<none>
Щоб розібратися в них, треба зрозуміти як працює файлова система образів Docker, і як організовані шари образів. В цьому пості для прикладу буде використовуватися образ Fedora. Демон Docker запущений на ноутбуці, і я збираюся завантажити образ fedora з docker hub.
docker images
На цьому скріншоті,
docker images
показує
fedora:latest
, а
docker images -a
вже два способу
fedora:latest
та
<none>:<none>
. Якщо ви використовуєте Docker, ви помічали, що кількість образів
<none>:<none>
зростає експоненціально числа завантажених образів.
Для чого потрібні образи
<none>:<none>
? Щоб зрозуміти це, потрібно знати як організовані шари файлової системи 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
і позначає його
<none>:<none>
, так як це лише один з шарів способу
fedora:latest
. У термінології Docker він називається проміжним чином за опції
a
.
Далі Docker завантажує шар
ded7cd95e059
і позначає його
fedora:latest
. Образ fedora:latest складається з цих двох верств, формуючи зв'язок батьків і дочірнього елемента.
parent child
Для перевірки існування родительско-дочірньої зв'язку ми можемо перевірити JSON файл шару
ded7cd95e059
.
parent JSON
Все вірно! Тепер ми зрозуміли що означають образи
<none>:<none>
. Це проміжні образи, які можуть бути побачені з використанням
docker images -a
. Вони не призводять до переповнення жорсткого диска, але займають багато місця у виводі команди. І досить складно зрозуміти до чого вони відносяться.
Ми відповіли на (1), (3) і (4). Давайте проллємо світло на (2).
Погані <none>:<none>
Інші образи
<none>:<none>
це відокремлені образи, які можуть переповнити жорсткий диск.
У мовах програмування Java і Golang відокремлений блок пам'яті, це блок без посилань з будь-якого місця в коді. Система збирання сміття таких мов періодично позначає блоки відокремленими і повертає їх у купу, після цього ці блоки доступні для майбутнього використання. Подібно їм, відокремлений шар файлової системи Docker це щось невикористовуване і не має посилань з будь-яких образів. Отже, нам потрібен спосіб вказати Docker очищати ці відокремлені образи.
Ми вже знаємо що значить
<none>:<none>
на
docker images -a
. Вище сказано, що це проміжні образи. Тим не менше при відсутності образів
<none>:<none>
у виведенні
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 успішно оновлено. Важлива річ, яку треба відзначити на верхньому скріншоті це образ
<none>:<none>
.
Якщо ви пам'ятаєте, образи
<none>:<none>
зазначені в
docker images -a
це проміжні (хороші) образи, але цей образ
<none>:<none>
є звичайним чином docker. Це окремий образ і повинен бути очищений. Коли образ
hello_world
пересобрали використовуючи Dockerfile, його посилання на стару Fedora стала незауваженою і відокремленої.
Ця команда може бути використана для очищення відособлених образів.
docker rmi $(docker images -f "dangling=true" -q)

Зараз Docker не має автоматичної системи збирання сміття. Буде круто мати таку. А поки що ця команда може використовуватися для ручної збірки сміття.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.