DockerJuniorTechnical

Что такое Docker image, container, registry — и какие отношения между ними?

Image — неизменяемый шаблон с filesystem layers и метаданными запуска. Container — запущенный экземпляр image с writable layer и runtime state. Registry хранит и раздаёт images по имени, тегу или digest.

Image — неизменяемый шаблон

Docker image — это пакет приложения: стек read-only слоёв файловой системы (overlay), конфигурация, переменные окружения, default command, entrypoint и metadata. Image создаётся командой docker build и идентифицируется тегом (nginx:stable) и digest (sha256:...).

Container — запущенный экземпляр

Container — это runtime объект, созданный из image: процесс или процессы, network namespace, mount namespace, writable слой поверх read-only слоёв image и состояние lifecycle (created, running, paused, stopped). Изменения внутри контейнера (созданные файлы, изменённые конфиги) попадают в writable слой и не меняют исходный image.

Registry — хранилище образов

Registry — удалённое хранилище, которое отдаёт image layers по HTTP API. docker pull скачивает слои по манифесту, docker push публикует. Registry хранит manifests, layers и теги. Публичные: Docker Hub, ghcr.io, quay.io. Приватные: Harbor, AWS ECR, GCP Artifact Registry.

Типичный CI/CD поток

# 1. Собрать image и присвоить тег
docker build -t registry.example.com/team/api:1.4.2 .

# 2. Опубликовать в registry
docker push registry.example.com/team/api:1.4.2

# 3. На production-сервере — скачать и запустить
docker pull registry.example.com/team/api:1.4.2
docker run --name api -p 8080:8080 \
  registry.example.com/team/api:1.4.2

# 4. Проверить digest для воспроизводимости
docker inspect registry.example.com/team/api:1.4.2 \
  --format '{{index .RepoDigests 0}}'

Слои и кэш

Слои image могут переиспользоваться несколькими образами и кэшироваться как локально, так и в registry (layer caching в CI). Изменение инструкции в середине Dockerfile инвалидирует кэш для всех последующих слоёв.

Подводные камни

  • Изменения в контейнере не сохраняются в image: writable слой существует только пока живёт контейнер (по умолчанию). Для постоянных данных используют volumes или bind mounts.
  • Тег может быть переиспользован: :latest или :main — это floating указатели. В production деплоить по digest: registry.example.com/api@sha256:abc123....
  • docker commit создаёт image из контейнера: это работает, но даёт непрозрачный image без истории сборки. Правильный путь — Dockerfile и docker build.
  • Удалённый контейнер не удаляет image: docker rm убирает контейнер, docker rmi — image. docker system prune удаляет всё неиспользуемое.
  • Registry без аутентификации — публичный: по умолчанию образы на Docker Hub публичны. Для приватных образов нужен docker login и приватный репозиторий или self-hosted registry.

Common mistakes

  • Считать, что docker commit или изменения в контейнере являются нормальным способом сборки production image.
  • Путать tag и digest, особенно при обсуждении rollout и rollback.
  • Описывать registry как сервис, который запускает контейнеры.

What the interviewer is testing

  • Разводит image, container и registry по lifecycle.
  • Понимает writable layer контейнера и immutable image layers.
  • Умеет описать CI/CD поток build, push, pull, run.

Sources

Related topics