Перейти до вмісту

Модуль 2.4: Шаруваті файлові системи (UnionFS)

Основи системи | Складність: [MEDIUM] | Час: 25–30 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після проходження цього модуля ви зможете:

  • Пояснити, як overlay-файлові системи забезпечують шаруватість образів контейнерів
  • Відстежити читання/запис файлу через стек overlay (lowerdir, upperdir, merged)
  • Дебажити проблеми зі сховищем у контейнерах, інспектуючи overlay mount
  • Порівняти OverlayFS з іншими реалізаціями union-файлових систем та пояснити, чому OverlayFS переміг

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Кожного разу, коли ви завантажуєте образ контейнера, запускаєте docker build або стартуєте под у Kubernetes, працюють шаруваті файлові системи (Union Filesystems). Вони роблять контейнери ефективними завдяки:

  • Спільному використанню шарів — 100 контейнерів з одного образу не потребують 100 копій файлів.
  • Copy-on-write (копіювання при записі) — тільки змінені файли займають додаткове місце.
  • Миттєвому запуску — не потрібно копіювати весь образ для кожного нового контейнера.

Розуміння UnionFS допоможе вам:

  • Оптимізувати образи — знати, чому порядок рядків у Dockerfile має значення.
  • Відлагоджувати проблеми з диском — чому контейнер займає так багато місця?
  • Розуміти кешування — чому Docker вирішив перезібрати цей шар?

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 за замовчуванням.

Коли ви запускаєте 100 однакових контейнерів nginx:

  1. Всі 100 контейнерів використовують одну й ту саму копію шарів образу nginx на диску.
  2. Кожен контейнер отримує свій власний, дуже тонкий “верхній шар” для тимчасових файлів та логів.
  3. Це дозволяє економити гігабайти дискового простору.

Кожна команда RUN, COPY, ADD у вашому Dockerfile створює новий шар.

Погана практика:

RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/* # ЦЕ НЕ ЗМЕНШИТЬ ОБРАЗ!

Оскільки шари незмінні, видалення файлів у новому шарі просто “ховає” їх, але вони все одно займають місце в попередніх шарах.

Добра практика:

RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/* # Все в одному шарі — образ менший

  1. Що станеться з даними, записаними в контейнер, після його видалення?

    Відповідь Вони зникнуть. Дані записуються у "верхній шар" контейнера, який видаляється разом із самим контейнером. Для постійного зберігання потрібно використовувати томи (Volumes).
  2. Чому 10 контейнерів з одного образу не займають у 10 разів більше місця?

    Відповідь Завдяки UnionFS вони всі ділять спільні Read-Only шари образу. Кожен контейнер має лише свій власний мінімальний шар для запису змін.
  3. Як працює механізм Copy-on-Write?

    Відповідь Коли процес намагається змінити файл, який належить до нижнього (Read-Only) шару, операційна система копіює цей файл у верхній (Read-Write) шар. Тільки після цього зміни вносяться в копію. Оригінал в образі залишається незмінним.
  4. Яка команда Docker дозволяє побачити шари образу?

    Відповідь `docker history <назва_образу>`.

Завдання: Дослідити шари образу.

  1. Подивіться історію будь-якого образу на вашій машині:
    Terminal window
    docker history nginx:alpine
  2. Знайдіть, де саме на диску лежать ці шари (якщо у вас Linux):
    Terminal window
    docker inspect nginx:alpine | grep -A 5 "Data"
    (Ви побачите шляхи до папок LowerDir, UpperDir та MergedDir).

Критерії успіху: Ви розумієте, що образ — це “пиріг” із шарів, і знаєте, як це перевірити.


  • Контейнери неймовірно легкі завдяки спільним шарам.
  • Образи незмінні — ви ніколи не міняєте файли в них, тільки створюєте копії при записі (COW).
  • Порядок команд у Dockerfile критичний для розміру та швидкості збірки.
  • Верхній шар контейнера ефемерний — видалили контейнер, видалили й шар.

Розділ «Примітиви контейнерів» завершено! Тепер ви знаєте три складові магії контейнерів: Namespaces (ізоляція), Cgroups (обмеження) та UnionFS (ефективне зберігання).

Далі: Розділ 3: Мережі в Linux — дізнайтеся, як пакети течуть крізь ядро та як працюють файрволи.