Подписывайтесь:

Блог AST-SoftPro

Docker для Python-разработчика: от контейнера до оркестрации

23.05.2026 8 мин чтения
Docker для Python-разработчика: от контейнера до оркестрации

Введение в Docker для Python-разработчиков

Docker — это платформа контейнеризации, позволяющая изолировать приложения и их зависимости от окружения. Для Python-разработчика использование Docker упрощает развертывание приложений: вместо установки всех библиотек вручную каждый разработчик получает одинаковую среду выполнения.

Контейнеры создаются на основе образов (images), которые описываются в Dockerfile. Образ содержит минимальный образ операционной системы, интерпретатор языка и установленные зависимости. Это снижает размер образа по сравнению с полной ОС и ускоряет запуск приложения.

Почему Python-разработчикам стоит использовать Docker?

Python-проекты часто зависят от множества пакетов (pip install -r requirements.txt), которые могут конфликтовать между разными версиями интерпретатора или версиями библиотек. Без Docker разные команды могут собирать приложение в разных условиях, что приводит к «работает у меня».

Docker решает эту проблему:

  • Обеспечивает воспроизводимость окружения.

  • Упростает тестирование и деплой на сервере с другими настройками.

  • Позволяет использовать миграционный подход (staging → production) без изменения кода.

Основы Docker: образы, контейнеры, CLI

Что такое образ?

Образ — это статическое представление приложения в контейнере. Он содержит:

  • Базовую ОС (например, python:3.10-slim).

  • Все необходимые библиотеки и зависимости.

  • Скрипт запуска (CMD или ENTRYPOINT).

Пример базового образа для Python:

file
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]

Что такое контейнер?

Контейнер — это запущенный образ. Он работает изолированно, имеет свои файлы и сетевые интерфейсы.

Команды для управления:

# Запуск контейнера из образа
docker run my-python-app:1.0

# Просмотр запущенных контейнеров
docker ps

# Остановка по имени или ID
docker stop <container_id>

Docker CLI — основные команды

Команда Назначение
docker build -t имя:версия . Сборка образа из Dockerfile в текущей директории
docker images Просмотр доступных образов
docker run образ Запуск контейнера на основе образа
docker ps Показ запущенных контейнеров

Практическая сборка Python-приложения с помощью Docker

Шаг 1: Подготовка проекта

Представим простой Flask-приложение:

# main.py
def hello():
    return "Hello from isolated container!"
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

Файл requirements.txt:

Flask==2.3.3
gunicorn==21.2.0

Шаг 2: Создание Dockerfile

Используем минимальный образ и устанавливаем зависимости:

file
FROM python:3.10-slim AS builder
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Копируем исходный код (опционально — можно отдельно)
COPY main.py ./

# Запуск через gunicorn для продакшена
FROM python:3.10-slim AS runtime
WORKDIR /app
COPY --from=builder /usr/local/lib/python*/site-packages ./.lib
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Копируем только нужные файлы (оптимизация)
COPY main.py ./
CMD ["gunicorn", "main:app", "--bind=0.0.0.0:8080"]

Примечание: Используется мультистейджная сборка — в первом этапе устанавливаются зависимости, во втором копируются только нужные файлы и запускается приложение.

Шаг 3: Сборка образа

В корне проекта выполните:

docker build -t my-flask-app:v1 .

После успешного выполнения проверим образ:

docker images | grep my-flask-app

Запуск:

docker run --name flask-container -p 8080:8080 my-flask-app:v1

Откройте http://localhost:8080, должно появиться сообщение.

Docker Compose — оркестрация нескольких сервисов

Когда приложение состоит из нескольких компонентов (например, Flask + база данных), управление каждым контейнером через CLI неудобно. Здесь помогает Docker Compose.

Что такое Docker Compose?

docker-compose.yml позволяет описывать несколько служб в одном файле и управлять ими одной командой: up, down, logs, exec и т.д.

Пример структуры проекта:

my-app/
├── app/
│   └── main.py
├── docker-compose.yml
└── requirements.txt
``

Файл `docker-compose.yml`: 
```yaml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    environment:
      DEBUG: "true"

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Примечание: web — сервис на основе текущего Dockerfile, db — готовый образ PostgreSQL. Данные базы сохраняются в volume (pgdata).

Работа с compose

## Запуск всех сервисов
docker-compose up -d

## Просмотр лога одного сервиса (например, web)
docker-compose logs web

## Остановка и удаление контейнеров
docker-compose down

Теперь приложение доступно по http://localhost:8080, а база данных запущена отдельно.

Мультистейджная сборка — оптимизация образа

Многослойные образы могут быть большими. Использование мультистейджа позволяет уменьшить размер финального образа за счёт удаления промежуточных слоёв (например, pip install).

Пример оптимизации:

file
## Stage 1: Установка зависимостей
FROM python:3.10-slim AS builder
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt && \    rm -rf ~/.cache/pip

## Stage 2: Минимальный образ без сборки (runtime)
FROM python:3.10-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python*/site-packages ./.lib
COPY main.py ./
CMD ["python", "main.py"]

Результат: Образ без кэша pip и лишней документации Python, размер — около 80–100 МБ.

Лучшие практики для Python-разработчиков

  • Используйте --no-cache-dir в pip install, чтобы избежать накопления кэшей.

  • Избегайте копирования всего кода (COPY . .) без необходимости.

  • Определяйте зависимости явно: только нужные версии пакетов, избегайте * в версиях.

  • Используйте .dockerignore, как .gitignore:

## Игнорируем файлы:
*.pyc
__pycache__/
.git
.env
Dockerfile.build

```

Заключение: Docker — инструмент для воспроизводимости и автоматизации

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

  • Устранить «работает на моём ПК».

  • Быстро тестировать изменения в изолированной среде.

  • Автоматизировать деплой без ручной настройки серверов.

Python-разработчик может начать с простого Dockerfile, а затем перейти к docker-compose и мультистейджной сборке. Это стандартный путь, который используют миллионы разработчиков по всему миру.

AI-Помощник