Skip to main content

Як Docker об'єднує шари в образі?

Docker об'єднує шари за допомогою механізмів union filesystem (OverlayFS, AUFS та ін.). Кожен шар - це окремий read-only шматок файлової системи, а при збірці образу ці шари логічно "нашаровуються" один на одного, утворюючи єдиний видимий root-fs для контейнера.

Як це працює по кроках

  1. Кожна інструкція Dockerfile створює шар FROM, RUN, COPY та ін. -> новий шар (read-only).
  2. Шари не зливаються фізично Docker не копіює вміст кожного шару всередину наступного. Замість цього він використовує union-mount, який робить їх єдиним деревом каталогів.
  3. OverlayFS об'єднує їх через механізми lowerdir/upperdir Основна схема:
КомпонентЩо це
lowerdirшари образу (read-only, один над одним)
upperdirшар зі змінами (під час роботи контейнера)
mergedпідсумкова, змонтована файлова система
  1. Коли файл змінюється - CoW (copy-on-write) Якщо контейнер змінює файл з нижнього шару, Docker копіює його у верхній шар і правка відбувається вже там, не торкаючись базових шарів.

Що це дає

ПеревагаЗа рахунок чого
Економія місцяшари повторно використовуються різними образами
Швидка збіркакеш шарів, раніше створені не перезбираються
Незмінністьнижні шари read-only, не псуються

Головна думка для middle-рівня

Docker не «склеює» шари в один фізичний шар. Він монтує їх поверх один одного за допомогою OverlayFS, а зміни в контейнері відбуваються лише у верхньому writable-шарі, використовуючи CoW.

Якщо хочеш, можу доповнити різницею між OverlayFS і AUFS або розібрати цей самий процес на рівні системних директорій (/var/lib/docker/overlay2).

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.