Короткий ответ
OverlayFS объединяет несколько read-only слоёв (lowerdir) с одним writable-слоем (upperdir) через union filesystem; при первой попытке изменить файл, унаследованный из нижнего слоя, он целиком копируется в upperdir (copy-up) перед модификацией, а не копируется весь образ.
Как это работает подробнее
overlay2 (стандартный storage driver Docker на современных ядрах Linux) показывает процессу контейнера объединённый вид файловой системы, "просвечивая" верхние изменения над нижними неизменяемыми слоями. Чтение файла, который не менялся, идёт прямо из соответствующего lowerdir. Как только контейнер пытается изменить такой файл, ядро выполняет copy-up — копирует файл целиком в upperdir, и дальнейшие изменения применяются уже к этой копии, не трогая оригинальный слой.
Пример кода
Пример конфигурации
$ docker inspect app --format '{{.GraphDriver.Data.UpperDir}}'
$ docker exec app sh -c "echo test >> /etc/config/large-file.conf"Что использовать на практике
- Практика. copy-up для очень больших файлов (например, больших лог-файлов или архивов внутри образа) может ощутимо замедлить первую операцию записи — поэтому для часто изменяемых больших файлов разумнее использовать volume, а не писать прямо в файловую систему writable-слоя контейнера.
Подводные камни
- Риск. считают, что overlay2 копирует весь образ при запуске контейнера — на самом деле копируются только отдельные файлы, и только в момент первой записи в них; не учитывают задержку copy-up при профилировании операций записи в приложениях с большими файлами внутри слоёв образа.