TGViewer
Код в Прод Код в Прод @codeinprod · 238 subscribers
Post #22 479
👩‍💻 Что такое Docker-образ на самом деле?

Откройте любое видео «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-архивы.

👨‍💻 Код в Прод
  • ❤ 9
  • 🔥 7
  • 👍 6
More from @codeinprod
  1. Sep 2, 2026👩‍💻 Запускаем контейнер вручную — без Docker В прошлый раз мы вскрыли Docker-образ и уви…
  2. Jul 27, 2026🐧 Заходишь на сервер, чтобы протестировать новый скрипт, а у chmod кто-то убрал x бит: -r…
  3. Jun 28, 2026👩‍💻 Как проверить сеть, если под рукой нет сетевых утилит? Представьте: ваше приложение…
  4. Apr 15, 2026🐧 Ты создал облачный сервер. Добавил туда SSH-ключ… как тебе казалось. Пытаешься зайти: s…
  5. Mar 6, 2026Post #20
  6. Mar 6, 2026Ставишь Nginx Ingress Controller в Kubernetes — и получаешь два балансировщика. В облаке п…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →