> Работал ли ты с 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.yml
services:
api:
build: .
ports:
- "8000:8000"
env_file: .env
depends_on:
db:
condition: service_healthy
volumes:
- ./app:/app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 10s
timeout: 5s
retries: 3
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
timeout: 3s
retries: 5
volumes:
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 - путаница при переопределении команд.

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

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