← Назад к вопросам

Из чего состоит образ в Docker

2.2 Middle🔥 162 комментариев
#Docker и контейнеризация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Структура Docker-образa

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

Ключевые компоненты Docker-образa

  1. Слои (Layers)
    *   Образ формируется как набор **неизменяемых слоев**, каждый из которых представляет изменения относительно предыдущего (например, добавление файлов, установка пакетов, изменение конфигурации).
    *   Слои хранятся в виде отдельных файлов (тар-архивов). Эта архитектура обеспечивает:
        *   **Кэширование:** Повторное использование уже существующих слоев при сборке новых образов и запуске контейнеров.
        *   **Компактность:** Образы делятся между контейнерами и реестрами, минимизируя объем передаваемых данных.
        *   **Версионирование:** Каждый новый образ часто добавляет лишь новые или измененные слои.

    Пример слоев при сборке простого Python-приложения:

```dockerfile
FROM python:3.9-slim  # Базовый образ (первый и самый большой слой)
COPY . /app           # Слой с файлами проекта
RUN pip install flask # Слой с установленными зависимостями
CMD ["python", "/app/main.py"]
```

2. Метаданные (Metadata)

    *   **Манифест (manifest):** JSON-файл, описывающий состав образa: список слоев, их порядок, контрольные суммы (digests), информация о архитектуре (amd64, arm64).
    *   **Конфигурационный слой (config layer):** Содержит **Docker-специфичные параметры**:
        *   История команд (например, из Dockerfile).
        *   Конфигурация будущего контейнера: environment variables, рабочий директория (`WORKDIR`), точка входа (`ENTRYPOINT`/`CMD`), информация о пользователе (`USER`), открытые порты (`EXPOSE`).
        *   Данные о базовом образе (`rootfs` — корневая файловая система).

    Пример структуры конфигурации (упрощенно):

```json
{
  "config": {
    "Env": ["PATH=/usr/local/bin"],
    "Cmd": ["python", "main.py"],
    "WorkingDir": "/app"
  },
  "rootfs": {
    "type": "layers",
    "diff_ids": ["sha256:abc123...", "sha256:def456..."]
  }
}
```

3. Корневая файловая система (rootfs)

    *   Это **виртуальное объединение всех слоев** в единую директорию, которую контейнер видит как свой корень (`/`).
    *   Слои накладываются друг на друга в строго определенном порядке, создавая итоговую структуру файлов и директорий. При запуске контейнера Docker создает из этой корневой системы и дополнительного тонкого **слоя записи (writeable layer)** его рабочую файловую систему.

Как это работает в реестре и при запуске

  1. В реестре (Registry): Образ хранится как набор отдельных тар-архивов (слоев) и файлов метаданных (манифест, конфигурация). При docker pull клиент скачивает только те слои, которые отсутствуют локально.
  2. При запуске контейнера: Docker использует образ как шаблон. Он монтирует слои образa и добавляет сверху тонкий слой записи (Container Layer), в котором происходят все изменения, сделанные в запущенном контейнере. Этот слой существует только во время жизни контейнера и удаляется вместе с ним (если не сохранен в новый образ через docker commit).

Заключение

Таким образом, Docker-образ — это не монолитный файл, а слоистая сборка (как git-коммит), состоящая из:

  • Набора неизменяемых слоев (тар-архивы).
  • Метаданных, описывающих конфигурацию будущего контейнера.
  • Виртуальной корневой файловой системы (rootfs), образуемой из этих слоев.

Эта архитектура делает Docker-образы эффективными для хранения, передачи и развертывания, обеспечивая быструю сборку, минимальный объем данных при обновлениях и стандартизированную среду для запуска контейнеров.