1. What is Docker?1. Что такое Docker?
Docker is a tool for containers. A container packages your application together with everything it needs to run — code, runtime, libraries, system tools — into one isolated, portable unit. That unit runs the same way anywhere Docker is installed, regardless of what's on the host machine.
Docker — это инструмент для контейнеров. Контейнер упаковывает твоё приложение вместе со всем, что нужно для запуска — код, рантайм, библиотеки, системные утилиты — в один изолированный переносимый блок. Этот блок работает одинаково везде, где установлен Docker, независимо от того, что стоит на хост-машине.
2. Why does it exist?2. Зачем он нужен?
The classic problem: code runs on the developer's laptop but breaks in production because the Python version, a library, or a system package differs. Docker kills that whole class of bugs:
Классическая проблема: код работает на ноутбуке разработчика, но падает в проде, потому что отличается версия Python, библиотека или системный пакет. Docker убивает целый класс таких багов:
- Consistency. The exact same image runs in dev, CI, and prod. No "works on my machine".
- Isolation. Each container has its own dependencies; two apps needing different Python versions coexist peacefully.
- Portability. Build once, run on any host (laptop, server, any cloud) with Docker.
- Lightweight & fast. Containers share the host OS kernel, so they start in seconds and use far less than a full virtual machine.
- Консистентность. Один и тот же образ бежит в dev, CI и проде. Никаких «у меня работает».
- Изоляция. У каждого контейнера свои зависимости; два приложения с разными версиями Python мирно сосуществуют.
- Переносимость. Собери один раз, запускай на любом хосте (ноутбук, сервер, любое облако) с Docker.
- Легковесность и скорость. Контейнеры используют ядро ОС хоста, поэтому стартуют за секунды и тратят куда меньше, чем полноценная виртуальная машина.
3. Core concepts3. Ключевые понятия
① Image① Image (образ)
A read-only template: the frozen snapshot of your app + its environment. Built from a Dockerfile. Think "the recipe baked into a ready-to-ship package".
Read-only шаблон: замороженный снимок приложения + его окружения. Собирается из Dockerfile. Думай «рецепт, запечённый в готовый к отгрузке пакет».
② Container② Container (контейнер)
A running instance of an image. One image → many containers, like one class → many objects. Containers are disposable: you start, stop, and throw them away.
Запущенный экземпляр образа. Один образ → много контейнеров, как один класс → много объектов. Контейнеры одноразовые: запускаешь, останавливаешь и выбрасываешь.
③ Dockerfile③ Dockerfile
A text recipe describing how to build the image, step by step: base image, copy code, install deps, set the start command. Each line becomes a cached layer.
Текстовый рецепт, описывающий сборку образа по шагам: базовый образ, копирование кода, установка зависимостей, команда запуска. Каждая строка становится кэшируемым слоем (layer).
④ Registry④ Registry (реестр)
Where images are stored and shared — Docker Hub, AWS ECR, GCP Artifact Registry. You push an image up and pull it down elsewhere, like GitHub for images.
Где хранятся и раздаются образы — Docker Hub, AWS ECR, GCP Artifact Registry. Ты делаешь push образа наверх и pull в другом месте — как GitHub для образов.
⑤ Volumes & ports⑤ Volumes и порты
Containers are ephemeral, so data written inside disappears when they're removed. Volumes persist data outside the container; port mapping exposes a container's port to the host.
Контейнеры эфемерны, поэтому данные, записанные внутри, исчезают при удалении. Volumes сохраняют данные снаружи контейнера; проброс портов открывает порт контейнера на хосте.
⑥ Docker Compose⑥ Docker Compose
A tool to define and run multiple containers together (e.g. app + database + queue) from one YAML file. Great for local dev of a multi-service stack.
Инструмент, чтобы описать и запустить несколько контейнеров вместе (например приложение + база + очередь) из одного YAML-файла. Отлично для локальной разработки многосервисного стека.
4. A minimal example4. Минимальный пример
A Dockerfile for a small Python data job, then the two commands to build and run it.
Dockerfile для небольшого Python-джоба по данным, затем две команды, чтобы собрать и запустить его.
# Dockerfile FROM python:3.12-slim # base image (a frozen mini-OS + Python) WORKDIR /app # working dir inside the container COPY requirements.txt . # copy deps first → layer caching RUN pip install -r requirements.txt COPY . . # copy the rest of the code CMD ["python", "pipeline.py"] # what runs when the container starts
# build an image named "my-pipeline" docker build -t my-pipeline . # run a container from it docker run --rm my-pipeline
requirements.txt and installing deps before copying your code, a code change doesn't re-run the slow pip install — only the layers after the change rebuild. This caching trick is a classic interview point.
Каждая строка Dockerfile — кэшируемый слой. Копируя requirements.txt и ставя зависимости до копирования кода, изменение кода не перезапускает медленный pip install — пересобираются только слои после изменения. Этот трюк с кэшем — классический вопрос на интервью.
5. Containers vs Virtual Machines5. Контейнеры vs виртуальные машины
Both isolate workloads, but at different levels. This is one of the most common Docker interview questions.
Оба изолируют нагрузки, но на разном уровне. Это один из самых частых вопросов про Docker на интервью.
| Virtual Machine | Container (Docker) | |
|---|---|---|
| Isolates at | Hardware level (full guest OS) | Process level (shares host kernel) |
| Size | Gigabytes (whole OS) | Megabytes (just app + deps) |
| Startup | Minutes (boots an OS) | Seconds (starts a process) |
| Overhead | Heavy (hypervisor + N OSes) | Light (one kernel shared) |
| Isolation strength | Stronger (full separation) | Weaker (shared kernel) |
| Виртуальная машина | Контейнер (Docker) | |
|---|---|---|
| Изолирует на уровне | Железа (полная гостевая ОС) | Процесса (общее ядро хоста) |
| Размер | Гигабайты (целая ОС) | Мегабайты (только приложение + зависимости) |
| Старт | Минуты (грузит ОС) | Секунды (запускает процесс) |
| Накладные расходы | Тяжёлые (гипервизор + N ОС) | Лёгкие (одно общее ядро) |
| Сила изоляции | Сильнее (полное разделение) | Слабее (общее ядро) |
6. Why a data engineer cares6. Почему это важно дата-инженеру
- Reproducible pipelines. Pin Python + libraries in an image so a job runs identically today and in a year.
- It's the unit of work for orchestrators. Flyte, Airflow (KubernetesExecutor), and Kubernetes all run your task as a container.
- Clean local dev. Spin up Postgres, Kafka, or Spark locally with one
docker compose up— no messy host installs. - CI/CD. Tests and builds run in containers for a clean, consistent environment every time.
- Dependency hell, solved. Conflicting library versions across jobs simply don't collide — each lives in its own image.
- Воспроизводимые пайплайны. Зафиксируй Python + библиотеки в образе, чтобы джоб бежал одинаково сегодня и через год.
- Это единица работы для оркестраторов. Flyte, Airflow (KubernetesExecutor) и Kubernetes запускают твою таску как контейнер.
- Чистая локальная разработка. Подними Postgres, Kafka или Spark локально одной
docker compose up— без грязных установок на хост. - CI/CD. Тесты и сборки бегут в контейнерах ради чистого консистентного окружения каждый раз.
- Ад зависимостей решён. Конфликтующие версии библиотек между джобами просто не сталкиваются — каждый в своём образе.
7. Quick self-check7. Быстрая самопроверка
Answer in your head, then tap to flip.Ответь про себя, потом нажми, чтобы перевернуть.