> Какие основные сущности есть в Docker (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: Python, Docker

> Пример ответа

Короткий ответ

Основные сущности Docker - это образ (image), контейнер (container), Dockerfile, том (volume), сеть (network) и registry (реестр). Образ - неизменяемый шаблон файловой системы и метаданных, контейнер - запущенный экземпляр образа с изолированным процессом. Dockerfile описывает сборку образа, volume обеспечивает персистентное хранение, network - связь между контейнерами, а registry хранит и распространяет образы.

Подробное объяснение

Образ (image) - read-only слоистая структура, содержащая файловую систему, зависимости, конфигурацию и команду запуска. Образы собираются из Dockerfile и не изменяются после создания - любые изменения порождают новый слой.

Контейнер (container) - runtime-экземпляр образа. Каждый контейнер имеет изолированные namespace (PID, NET, MNT, UTS, IPC) и cgroups для ограничения ресурсов. Контейнер добавляет writable layer поверх образа, который удаляется при удалении контейнера.

Dockerfile - декларативный скрипт сборки: инструкции FROM, RUN, COPY, ENV, CMD, ENTRYPOINT, EXPOSE. Каждая инструкция создаёт слой, что влияет на размер и кэширование.

Volume - механизм персистентного хранения данных вне жизненного цикла контейнера. Бывают named volumes, bind mounts и tmpfs.

Network - виртуальные сети для изоляции и коммуникации: bridge (по умолчанию), host, none, overlay (для Swarm), macvlan. Контейнеры в одной bridge-сети общаются по имени.

Registry - сервер хранения образов: Docker Hub, private registry, Amazon ECR. Работает по протоколу push/pull.

Дополнительно: docker-compose (оркестрация нескольких контейнеров), docker daemon и CLI - но это уже инструменты, а не сущности.

На практике

Для senior-позиции важно понимать не просто список, а взаимосвязи и trade-off:

  • Слои и кэширование: порядок инструкций в Dockerfile критичен - часто меняющиеся слои ставятся в конец, чтобы использовать build cache.
  • Multi-stage builds: уменьшают размер образа, отделяя build-зависимости от runtime.
  • Healthcheck и restart policies: влияют на надёжность в production.
  • Сети: различать bridge (изоляция) и host (производительность), понимать DNS-резолвинг между контейнерами.
  • Volumes: bind mount для разработки (горячая перезагрузка), named volume для production данных.
  • Безопасность: не запускать контейнер от root, использовать read-only rootfs, ограничивать capabilities.

В Python-проектах типичная проблема - образ с полным virtualenv, который раздувается. Решение - multi-stage: слой с pip install, затем копирование только site-packages.

Пример кода

# Multi-stage build для Python-приложения
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --prefix=/install -r requirements.txt

FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY . .
RUN useradd -m appuser
USER appuser
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]

Как отвечать на собеседовании

Начните с краткого перечисления сущностей, затем углубитесь в 2-3 ключевые. Покажите системное мышление: объясните, как сущности связаны (образ → контейнер, Dockerfile → образ, volume/network → контейнер). Приведите пример из реального опыта: как вы оптимизировали образ или решали проблему с сетями. Если спросят про отличия - чётко разделите image (immutable) и container (mutable). Не перечисляйте все команды Docker - это уровень junior.

Что проверяет интервьюер

  • Понимание принципов изоляции и слоистости образов.
  • Умение объяснить жизненный цикл контейнера.
  • Знание практических аспектов: кэш, multi-stage, сети, volumes.
  • Способность рассуждать о trade-off (например, bind mount vs volume).
  • Понимание, как Docker вписывается в CI/CD и оркестрацию (Kubernetes, Swarm).

Типичные ошибки

  • Путаница между образом и контейнером: "контейнер - это образ" - неверно.
  • Утверждение, что данные в контейнере персистентны - writable layer живёт только с контейнером.
  • Игнорирование слоёв: "RUN apt-get install" после COPY кода - ломает кэш.
  • Непонимание разницы между CMD и ENTRYPOINT.
  • Запуск от root в production - грубая ошибка безопасности.
  • Ответ только перечислением команд (docker run, docker build) без объяснения сущностей.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью