Блог AST-SoftPro
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 и мультистейджной сборке. Это стандартный путь, который используют миллионы разработчиков по всему миру.