> Работал ли ты с Docker и Docker Compose (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: MTS, inpglobal, Sunlight
Стек: Python
> Пример ответа
Короткий ответ
Да, активно работаю с Docker и Docker Compose в продакшене и локальной разработке. Использую Docker для изоляции сервисов, версионирования окружений и упрощения деплоя, а Docker Compose - для оркестрации multi-container приложений (API, БД, очередь, воркеры). Также знаком с multi-stage сборками, healthcheck, volume, network policy и профилями Compose.
Подробное объяснение
В Python-проектах Docker решает несколько задач: воспроизводимость окружения, изоляция зависимостей и упрощение онбординга. Обычно я создаю образ на базе python:3.12-slim, использую multi-stage сборку для уменьшения размера - отдельный слой для зависимостей и отдельный для исходников. В Compose описываю сервисы: api, worker, postgres, redis, nginx. Для каждого задаю build, env_file, depends_on с условиями, healthcheck и volumes для разработки.
Важный аспект - управление конфигурацией: переменные окружения через .env, секреты через Docker secrets или внешние хранилища. Для продакшена использую профили Compose (--profile prod) или отдельный docker-compose.prod.yml с ограничением ресурсов, рестартами и логированием. Также приходится работать с сетями: bridge для внутреннего взаимодействия, host для сервисов, требующих прямого доступа.
В CI/CD Docker используется для сборки и пуша образов в registry, а также для запуска тестов в изолированных контейнерах. При этом важно учитывать кэширование слоёв - порядок инструкций в Dockerfile влияет на скорость сборки.
На практике
В типичном Python-проекте структура выглядит так: Dockerfile для API, docker-compose.yml для локальной разработки, docker-compose.prod.yml для продакшена. Для локальной разработки монтирую исходники в контейнер (volumes: - ./app:/app), чтобы не пересобирать образ при каждом изменении. Для продакшена - копирую код в образ и запускаю через gunicorn или uvicorn.
Часто использую depends_on с condition: service_healthy для БД и кэша, чтобы избежать гонок при старте. Для воркеров (Celery, RQ) добавляю отдельный сервис с тем же образом, но другой командой. Для отладки - docker compose exec и docker compose logs -f.
Пример кода
# Dockerfile FROM python:3.12-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt FROM python:3.12-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH EXPOSE 8000 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
YAML# docker-compose.ymlservices:api:build: .ports:- "8000:8000"env_file: .envdepends_on:db:condition: service_healthyvolumes:- ./app:/apphealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8000/health"]interval: 10stimeout: 5sretries: 3db:image: postgres:16environment:POSTGRES_USER: appPOSTGRES_PASSWORD: secretvolumes:- pgdata:/var/lib/postgresql/datahealthcheck:test: ["CMD-SHELL", "pg_isready -U app"]interval: 5stimeout: 3sretries: 5volumes:pgdata:
Как отвечать на собеседовании
Начни с конкретных примеров: какие сервисы поднимал, какие проблемы решал. Упомяни, что используешь Docker не только для локальной разработки, но и в CI/CD. Расскажи про оптимизацию образов (multi-stage, порядок слоёв, .dockerignore). Покажи понимание разницы между docker run и Compose, между build и pull. Если спросят про продакшен - упомяни ограничение ресурсов, рестарты, логирование, секреты. Не углубляйся в Kubernetes, если не спрашивают, но отметь, что Docker - это база для оркестрации.
Что проверяет интервьюер
Проверяется практический опыт: не просто "знаю, что такое Docker", а умение проектировать окружение для реального проекта. Важно показать понимание lifecycle контейнеров, сетей, volume, healthcheck. Также оценивается способность объяснить trade-off между монтированием исходников и копированием в образ, между slim и полным образом. Интервьюер смотрит, как ты решаешь проблемы: например, почему контейнер не стартует, как дебажить сеть между сервисами.
Типичные ошибки
- Говорить "использую Docker" без конкретики - нет примеров и деталей.
- Путать
docker-composeиdocker compose(первый - старый CLI, второй - плагин). - Не упоминать
.dockerignore- образы получаются огромными. - Использовать
latestтеги в продакшене без фиксации версий. - Игнорировать healthcheck и
depends_on- сервисы стартуют в неправильном порядке. - Монтировать исходники в продакшене - это нарушает воспроизводимость.
- Не различать
CMDиENTRYPOINT- путаница при переопределении команд.
> Похожие задачи по Python
В чем разница HTTP методов GET, POST, PUT, DELETE и когда их использовать
Какова алгоритмическая сложность добавления элемента в начало и конец списка в Python
Какие стеки технологий вы использовали
Как устроены структуры данных list, dict и set в Python?
> Похожие задачи по backend
В чем разница HTTP методов GET, POST, PUT, DELETE и когда их использовать
Какова алгоритмическая сложность добавления элемента в начало и конец списка в Python
Какие стеки технологий вы использовали
Как устроены структуры данных list, dict и set в Python?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью