Почему в docker только верхний слой изменяемый?

Создал образ, запустил контейнер, почему все изменения только в верхнем слое? Изменялись бы все слои, что такого, контейнер завершил работу и уничтожился, нужно, запустил еще один из образа. Если удалить файл из нижнего слоя, размер не изменится, файл как бы окажется скрыт, а все изменения будут скопированы в верхний слой, почему и для чего так???


Ответы (1 шт):

Автор решения: aleksandr barakin

почему и для чего так?

в первую (и вторую) очередь — для воспроизводимости контейнеров и экономии места.

и задачи эти взаимосвязаны:

вот представим, что вы удалили файл, запустив контейнер, затем «контейнер завершил работу и уничтожился», а исходный образ уже изменился — в нём отсутствует тот файл, что вы удалили. теперь другие контейнеры, использующие ту же файловую систему (тот же образ), могут перестать работать (или станут работать иначе) именно из-за отсутствия этого файла.

т.е., чтобы поддерживать воспроизводимость, надо держать две копии исходного образа — одну с этим файлом, а другую — без. а в следующий раз вы, запустив контейнер, ещё один файл удалили — надо ещё одну копию держать. и так далее. очень неэкономно получается.

вот мы и подошли к экономии места. а что если не делать полной копии всей файловой системы каждый раз, а отдельно фиксировать лишь внесённые изменения? создали файл — добавляется лишь его содержимое, и немного служебной информации (измеряемой байтами, максимум — килобайтами). удалили файл — добавляется лишь немного служебной информации (тоже максимум несколько килобайт).

берём исходный образ, накладываем новый слой (и даже не один) файловой системы с теми изменения, которые нам нужны — получаем «два в одном»: и экономию места, и воспроизводимость.

дополнение.

а может быть, вы, задавая вопрос, исходили из предположения, что при запуске контейнера создаётся копия файловой системы (т.е., образа)? нет, так не делается. файловая система не копируется при запуске — так гораздо быстрее (и, опять же, место экономится).

→ Ссылка