Модуль 2.4: Шаруваті файлові системи (UnionFS)
Основи системи | Складність:
[MEDIUM]| Час: 25–30 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 1.3: Ієрархія файлової системи
- Обов’язково: Модуль 2.1: Простори імен Linux (поняття mount namespace).
- Бажано: Розуміння того, що таке образи контейнерів.
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після проходження цього модуля ви зможете:
- Пояснити, як overlay-файлові системи забезпечують шаруватість образів контейнерів
- Відстежити читання/запис файлу через стек overlay (lowerdir, upperdir, merged)
- Дебажити проблеми зі сховищем у контейнерах, інспектуючи overlay mount
- Порівняти OverlayFS з іншими реалізаціями union-файлових систем та пояснити, чому OverlayFS переміг
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Кожного разу, коли ви завантажуєте образ контейнера, запускаєте docker build або стартуєте под у Kubernetes, працюють шаруваті файлові системи (Union Filesystems). Вони роблять контейнери ефективними завдяки:
- Спільному використанню шарів — 100 контейнерів з одного образу не потребують 100 копій файлів.
- Copy-on-write (копіювання при записі) — тільки змінені файли займають додаткове місце.
- Миттєвому запуску — не потрібно копіювати весь образ для кожного нового контейнера.
Розуміння UnionFS допоможе вам:
- Оптимізувати образи — знати, чому порядок рядків у Dockerfile має значення.
- Відлагоджувати проблеми з диском — чому контейнер займає так багато місця?
- Розуміти кешування — чому Docker вирішив перезібрати цей шар?
Що таке Union Filesystem?
Розділ «Що таке Union Filesystem?»UnionFS — це технологія, яка об’єднує декілька директорій (шарів) в один віртуальний вигляд.
┌─────────────────────────────────────────────────────────────┐│ ОБ'ЄДНАНИЙ ВИГЛЯД (MERGED VIEW) │├─────────────────────────────────────────────────────────────┤│ ││ Що бачить контейнер: ││ ┌─────────────────────┐ ││ │ / │ ││ │ ├── bin/ │ ││ │ ├── etc/nginx/ │ ││ │ └── app/myapp │ ││ └─────────────────────┘ ││ ▲ ││ │ Об'єднання ││ │ ││ ┌───────────────────────┐ ← Шар контейнера (RW - запис) ││ │ /app/myapp (змінено) │ (Тільки ваші зміни) ││ ├───────────────────────┤ ││ │ /etc/nginx/ │ ← Шар образу (RO - читання) ││ ├───────────────────────┤ ││ │ /bin/ │ ← Базовий шар (RO - читання) ││ └───────────────────────┘ ││ │└─────────────────────────────────────────────────────────────┘Ключові поняття:
Розділ «Ключові поняття:»- Шар (Layer): Директорія, що містить тільки зміни відносно попереднього стану.
- Нижні шари (Lower): Образ контейнера. Вони завжди доступні тільки для читання (Read-Only).
- Верхній шар (Upper): Спеціальний шар конкретного контейнера. Тільки він доступний для запису.
- Copy-on-write (COW): Якщо ви хочете змінити файл із нижнього шару, ядро спочатку копіює його у верхній шар, і тільки потім дозволяє змінити.
OverlayFS: Стандарт індустрії
Розділ «OverlayFS: Стандарт індустрії»OverlayFS — це сучасна реалізація UnionFS, яка вбудована в ядро Linux і використовується Docker та Kubernetes за замовчуванням.
Як це працює в Docker:
Розділ «Як це працює в Docker:»Коли ви запускаєте 100 однакових контейнерів nginx:
- Всі 100 контейнерів використовують одну й ту саму копію шарів образу nginx на диску.
- Кожен контейнер отримує свій власний, дуже тонкий “верхній шар” для тимчасових файлів та логів.
- Це дозволяє економити гігабайти дискового простору.
Оптимізація Dockerfile
Розділ «Оптимізація Dockerfile»Кожна команда RUN, COPY, ADD у вашому Dockerfile створює новий шар.
Погана практика:
RUN apt-get updateRUN apt-get install -y curlRUN rm -rf /var/lib/apt/lists/* # ЦЕ НЕ ЗМЕНШИТЬ ОБРАЗ!Оскільки шари незмінні, видалення файлів у новому шарі просто “ховає” їх, але вони все одно займають місце в попередніх шарах.
Добра практика:
RUN apt-get update && \ apt-get install -y curl && \ rm -rf /var/lib/apt/lists/* # Все в одному шарі — образ меншийТест
Розділ «Тест»-
Що станеться з даними, записаними в контейнер, після його видалення?
Відповідь
Вони зникнуть. Дані записуються у "верхній шар" контейнера, який видаляється разом із самим контейнером. Для постійного зберігання потрібно використовувати томи (Volumes). -
Чому 10 контейнерів з одного образу не займають у 10 разів більше місця?
Відповідь
Завдяки UnionFS вони всі ділять спільні Read-Only шари образу. Кожен контейнер має лише свій власний мінімальний шар для запису змін. -
Як працює механізм Copy-on-Write?
Відповідь
Коли процес намагається змінити файл, який належить до нижнього (Read-Only) шару, операційна система копіює цей файл у верхній (Read-Write) шар. Тільки після цього зміни вносяться в копію. Оригінал в образі залишається незмінним. -
Яка команда Docker дозволяє побачити шари образу?
Відповідь
`docker history <назва_образу>`.
Практична вправа
Розділ «Практична вправа»Завдання: Дослідити шари образу.
- Подивіться історію будь-якого образу на вашій машині:
Terminal window docker history nginx:alpine - Знайдіть, де саме на диску лежать ці шари (якщо у вас Linux):
(Ви побачите шляхи до папок
Terminal window docker inspect nginx:alpine | grep -A 5 "Data"LowerDir,UpperDirтаMergedDir).
Критерії успіху: Ви розумієте, що образ — це “пиріг” із шарів, і знаєте, як це перевірити.
Підсумок
Розділ «Підсумок»- Контейнери неймовірно легкі завдяки спільним шарам.
- Образи незмінні — ви ніколи не міняєте файли в них, тільки створюєте копії при записі (COW).
- Порядок команд у Dockerfile критичний для розміру та швидкості збірки.
- Верхній шар контейнера ефемерний — видалили контейнер, видалили й шар.
Розділ «Примітиви контейнерів» завершено! Тепер ви знаєте три складові магії контейнерів: Namespaces (ізоляція), Cgroups (обмеження) та UnionFS (ефективне зберігання).
Далі: Розділ 3: Мережі в Linux — дізнайтеся, як пакети течуть крізь ядро та як працюють файрволи.