Откройте любое видео «Docker за 5 минут» — и вам почти наверняка скажут что-то из этого:
🔹 «Образ — это как ISO-образ диска».
🔹 «Dockerfile — это рецепт, а образ — готовое блюдо».
🔹 «Это коробка, в которой лежит ваше приложение».
Для первого знакомства — сойдёт. Но за этими метафорами полностью теряется то, чем образ является технически. А там всё устроено понятно и логично.
Если коротко: Docker-образ — это просто набор файлов, собранных по стандарту OCI. Внутри лежат слои с файлами, а к ним — описание, что и куда складывать. Давайте просто вскроем образ руками и посмотрим, что внутри.
1️⃣ Скачиваем образ без Docker
Возьмём
skopeo — это утилита для работы с образами напрямую в registry: умеет копировать, инспектировать и перекладывать образы между хранилищами, без запущенного Docker-демона. Выгрузим образ прямо в директорию:mkdir nginx-image
skopeo copy docker://docker.io/nginx:1.29 dir:nginx-image
nginx-image/
├── 20d41cd6829d...
├── 382a36159731...
├── 38a7e44929f3...
├── ... (ещё несколько таких же)
├── manifest.json
└── version
Никакого «диска» и никакой «коробки». Просто набор файлов с sha256-именами и
manifest.json. С него и начнём.2️⃣ Открываем
manifest.json — оглавление образаcat manifest.json
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:5dfe511714e1fa9a9d1074193a6cc7fa0feab5d680be166336817a5fb57f4cbd",
"size": 9085
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:57fb71246055257a374deb7564ceca10f43c2352572b501efc08add5d24ebb61",
"size": 29780226
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:38a7e44929f3a02caf5d606403b9c7f843cf5fd963a30bd77d9a4deea44cc4e0",
"size": 33157664
},
...
Сам манифест не хранит данные. Это просто оглавление: ссылки (в поле digest) на конфиг образа и на слои.
3️⃣ Находим конфиг образа (image config) — паспорт образа
Возьмём digest из
.config и откроем соответствующий файл:cat 5dfe511714e1f... | jq '.'
Внутри — метаданные образа: какая команда запускается (CMD), переменные окружения (ENV), история сборки слоёв. Это все те инструкции, которые вы описывали в
Dockerfile.4️⃣ Вскрываем слой
Самое интересное — слои. Возьмём digest любого слоя из манифеста. В поле
mediaType уже видно: ...tar+gzip. То есть слой — это обычный gzip-архив. Попробуем его распаковать:mkdir layer
tar -xzvf 38a7e44929f... -C layer
docker-entrypoint.d/
etc/
usr/
var/
Внутри слоя — просто кусок файловой системы. Никакой магии, обычные файлы и директории, упакованные в
tar.gz. Образ целиком — это несколько таких слоёв, которые при запуске накладываются друг на друга.📌 Итого: Docker-образ — это аккуратная адресуемая структура по стандарту OCI: манифест говорит что где лежит, конфиг образа хранит метаданные сборки, а слои — это tar.gz-архивы.
👨💻 Код в Прод