Як Docker об'єднує шари в образі?
Docker об'єднує шари за допомогою механізмів union filesystem (OverlayFS, AUFS та ін.). Кожен шар - це окремий read-only шматок файлової системи, а при збірці образу ці шари логічно "нашаровуються" один на одного, утворюючи єдиний видимий root-fs для контейнера.
Як це працює по кроках
- Кожна інструкція Dockerfile створює шар
FROM,RUN,COPYта ін. -> новий шар (read-only). - Шари не зливаються фізично Docker не копіює вміст кожного шару всередину наступного. Замість цього він використовує union-mount, який робить їх єдиним деревом каталогів.
- OverlayFS об'єднує їх через механізми
lowerdir/upperdirОсновна схема:
| Компонент | Що це |
|---|---|
lowerdir | шари образу (read-only, один над одним) |
upperdir | шар зі змінами (під час роботи контейнера) |
merged | підсумкова, змонтована файлова система |
- Коли файл змінюється - CoW (copy-on-write) Якщо контейнер змінює файл з нижнього шару, Docker копіює його у верхній шар і правка відбувається вже там, не торкаючись базових шарів.
Що це дає
| Перевага | За рахунок чого |
|---|---|
| Економія місця | шари повторно використовуються різними образами |
| Швидка збірка | кеш шарів, раніше створені не перезбираються |
| Незмінність | нижні шари read-only, не псуються |
Головна думка для middle-рівня
Docker не «склеює» шари в один фізичний шар. Він монтує їх поверх один одного за допомогою OverlayFS, а зміни в контейнері відбуваються лише у верхньому writable-шарі, використовуючи CoW.
Якщо хочеш, можу доповнити різницею між OverlayFS і AUFS або розібрати цей самий процес на рівні системних директорій (/var/lib/docker/overlay2).
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.