Встречается на 24% собеседований по Python

Расскажи про свой опыт работы с Docker

Мой опыт работы с Docker включает контейнеризацию Python-приложений, создание многоконтейнерных сред с помощью Docker Compose и интеграцию Docker-образов в CI/CD-пайплайны. Docker позволяет упаковать приложение со всеми его зависимостями в изолированный контейнер, что обеспечивает одинаковое поведение на любом окружении — от локальной машины до продакшн-сервера.

Как я использовал Docker

Контейнеризация приложений

Я писал Dockerfile для упаковки Python-приложений на базе FastAPI и Django. В Dockerfile я определял базовый образ (например, python:3.11-slim), устанавливал зависимости через pip, копировал исходный код и задавал команду запуска. Это позволяло быстро разворачивать приложение в любом окружении без ручной настройки.

Пример простого Dockerfile для FastAPI-приложения:

dockerfile
# Базовый образ с Python 3.11
FROM python:3.11-slim

# Устанавливаем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

Копируем код приложения

COPY . /app
WORKDIR /app

Команда запуска

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

text

### Многоконтейнерные среды с Docker Compose

Для локальной разработки и тестирования я использовал `docker-compose.yml`, который описывал несколько сервисов: само приложение, базу данных PostgreSQL, кэш Redis и другие зависимости. Это позволяло одной командой `docker-compose up` поднять всё окружение, что ускоряло онбординг новых разработчиков и устраняло проблему «на моей машине работает».

Пример `docker-compose.yml`:

```yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb

  redis:
    image: redis:7

Интеграция с CI/CD

Docker-образы активно использовались в пайплайнах непрерывной интеграции. Например, в GitLab CI или GitHub Actions мы собирали образ приложения, прогоняли в нём тесты, а затем публиковали образ в registry для последующего деплоя. Это обеспечивало консистентность между тестовым и продакшн-окружениями.

Подводные камни

  • Размер образов: без оптимизации образы могут быть большими. Используйте многоступенчатую сборку (multi-stage builds) и лёгкие базовые образы.
  • Управление зависимостями: важно правильно кэшировать слои в Dockerfile, чтобы ускорить сборку. Например, копировать requirements.txt до копирования кода.
  • Сеть и volumes: при работе с несколькими контейнерами нужно правильно настраивать сети и монтировать volumes для сохранения данных.
  • Безопасность: не запускайте контейнеры от root, используйте непривилегированных пользователей и сканируйте образы на уязвимости.

Когда использовать Docker

Docker полезен практически в любом проекте, где требуется воспроизводимость окружения. Особенно он незаменим при микросервисной архитектуре, в CI/CD и при работе в команде, где у всех разные операционные системы. Однако для очень простых проектов или при ограниченных ресурсах можно обойтись без него.

Коротко

  • Docker обеспечивает изоляцию и переносимость приложений.
  • Docker Compose упрощает запуск многоконтейнерных сред.
  • Docker-образы интегрируются в CI/CD для тестирования и деплоя.
  • Следите за размером образов, безопасностью и правильной настройкой сетей.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы