Ответ
Docker-образ — это неизменяемый (immutable) шаблон, который содержит все необходимое для запуска приложения: код, рантайм, системные инструменты, библиотеки и настройки. Его структура основана на концепции слоев (layers).
Ключевые компоненты Docker-образа:
-
Файловые слои (Filesystem Layers)
- Образ состоит из набора слоев, доступных только для чтения (read-only).
- Каждая инструкция в
Dockerfile
(например,FROM
,RUN
,COPY
,ADD
) создает новый слой поверх предыдущего. - Каждый слой представляет собой изменения в файловой системе (добавленные, измененные или удаленные файлы) по сравнению с нижележащим слоем.
- Эта слоистая архитектура позволяет эффективно кэшировать сборку и экономить дисковое пространство, так как разные образы могут использовать общие слои.
-
Манифест образа (Image Manifest)
- Это JSON-файл, который описывает образ. Он действует как "оглавление".
- Манифест содержит ссылки на все слои, из которых состоит образ, а также на его конфигурационный объект.
-
Конфигурация образа (Image Configuration)
- Это еще один JSON-объект, который хранит метаданные, необходимые для запуска контейнера из этого образа.
- Включает в себя такие параметры, как:
Cmd
иEntrypoint
: команда, которая будет выполнена при запуске контейнера.Env
: переменные окружения.ExposedPorts
: порты, которые приложение слушает внутри контейнера.WorkingDir
: рабочая директория по умолчанию.
Пример связи с Dockerfile
# 1. Базовый слой (содержит ОС Alpine)
FROM alpine:3.14
# 2. Новый слой: копирование файлов приложения
COPY app /app
# 3. Новый слой: установка пакета curl
RUN apk add --no-cache curl
# 4. Метаданные (часть конфигурации образа)
CMD ["/app/run"]
Когда из этого образа запускается контейнер, Docker создает поверх всех read-only слоев образа новый, записываемый слой (writable layer), также известный как "контейнерный слой". Все изменения, которые происходят во время работы контейнера (создание, изменение, удаление файлов), записываются в этот верхний слой.