Что такое контейнеризация и зачем она нужна
Что проверяют
Понимаете ли вы, что контейнер это изолированный процесс на ядре хоста, а не маленькая виртуальная машина, и умеете ли упаковать Python-сервис так, чтобы он нормально жил в продакшене. Следом обычно просят набросать Dockerfile или объяснить, чем контейнер отличается от virtualenv.
Как отвечать
Контейнеризация это упаковка приложения вместе с интерпретатором, системными библиотеками и зависимостями в образ, который одинаково запускается на ноутбуке, в CI и на сервере. Технически это обычный процесс Linux, которому ядро ограничивает видимость через namespaces (pid, net, mount, user) и ресурсы через cgroups. Образ собран из слоёв (overlayfs), формат стандартизован OCI, поэтому образ из Docker запустится в Podman или containerd.
Зачем это Python-разработчику:
- воспроизводимость:
venvизолирует только пакеты, а контейнер фиксирует версию Python и системные библиотеки вродеlibpq, от которых зависятpsycopgи другие пакеты с C-расширениями; - изоляция сервисов: у каждого сервиса свои зависимости без конфликтов версий;
- один артефакт: CI собирает образ, тесты гоняются на нём же, и этот же образ уходит в прод;
- оркестрация:
docker composeлокально, Kubernetes в продакшене.
Хороший Dockerfile для Python: базовый python:3.13-slim (Alpine с musl часто означает сборку пакетов из исходников), сначала копируются pyproject.toml и lock-файл и ставятся зависимости (uv sync --frozen или pip install --no-cache-dir), потом код, чтобы кэш слоя не сбрасывался на каждой правке. Плюс PYTHONUNBUFFERED=1 для логов, запуск не от root и .dockerignore с .venv и .git.
Где спотыкаются
Пишут CMD в shell-форме. Команда запускается через /bin/sh -c, и SIGTERM при docker stop может не дойти до приложения: через 10 секунд его убьют SIGKILL без корректного завершения. Нужна exec-форма со списком.
Запускают сервер на 127.0.0.1 внутри контейнера и не понимают, почему он недоступен снаружи. Слушать надо 0.0.0.0.
Считают число воркеров gunicorn по os.cpu_count(). При ограничении --cpus функция всё равно видит все ядра хоста, и сервис плодит лишние процессы, поэтому число воркеров лучше задавать явно.