← Назад к курсу

Использование Docker для Python-проектов

1. Введение в Docker

Что такое Docker?

Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры позволяют упаковать приложение со всеми его зависимостями в стандартизированную единицу.

Преимущества для Python-проектов:

  • Изоляция окружения - разные версии Python и библиотек для разных проектов
  • Консистентность - одинаковое окружение на всех машинах
  • Упрощение деплоя - легко переносить между средами
  • Повторяемость - любой разработчик может запустить проект одинаково

2. Установка Docker

Для Ubuntu/Debian:

sudo apt-get update
sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker

Для Windows/macOS:

Скачайте и установите Docker Desktop с официального сайта.

Проверка установки:

docker --version
docker run hello-world

3. Основные концепции

Dockerfile

Текстовый файл с инструкциями для создания образа

Образ (Image)

Шаблон для создания контейнеров (как класс в ООП)

Контейнер (Container)

Запущенный экземпляр образа (как объект в ООП)

Docker Compose

Инструмент для управления многоконтейнерными приложениями

4. Создание простого Python-приложения

Структура проекта:

my-python-app/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml

app.py:

from flask import Flask
import redis

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = cache.incr('hits')
    return f'Hello World! Просмотров: {count}\n'

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

requirements.txt:

Flask==2.3.3
redis==4.6.0

5. Создание Dockerfile

# Используем официальный Python образ
FROM python:3.11-slim

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем файл зависимостей
COPY requirements.txt .

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

# Копируем остальные файлы
COPY . .

# Открываем порт
EXPOSE 5000

# Команда для запуска приложения
CMD ["python", "app.py"]

Описание инструкций:

  • FROM - базовый образ
  • WORKDIR - рабочая директория в контейнере
  • COPY - копирование файлов
  • RUN - выполнение команд при сборке
  • EXPOSE - порты для внешнего доступа
  • CMD - команда для запуска контейнера

6. Сборка и запуск контейнера

Сборка образа:

docker build -t my-python-app .

Запуск контейнера:

docker run -p 5000:5000 my-python-app

Полезные команды:

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

# Просмотр всех контейнеров
docker ps -a

# Остановка контейнера
docker stop <container_id>

# Просмотр логов
docker logs <container_id>

# Запуск в интерактивном режиме
docker run -it my-python-app /bin/bash

# Удаление контейнера
docker rm <container_id>

# Удаление образа
docker rmi my-python-app

7. Использование Docker Compose

docker-compose.yml:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    depends_on:
      - redis
    environment:
      - FLASK_ENV=development

  redis:
    image: "redis:alpine"
    ports:
      - "6379:6379"

Команды Docker Compose:

# Запуск приложения
docker-compose up

# Запуск в фоновом режиме
docker-compose up -d

# Остановка
docker-compose down

# Пересборка
docker-compose up --build

# Просмотр логов
docker-compose logs

8. Продвинутые темы

Многоэтапная сборка:

# Этап сборки
FROM python:3.11 as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# Финальный этап
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]

Использование .dockerignore:

__pycache__/
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
.venv/
.idea/
.vscode/
*.log
.git/

Переменные окружения:

# В Dockerfile
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=production
# При запуске
docker run -e "FLASK_ENV=development" my-python-app

9. Лучшие практики

  1. Используйте .dockerignore - уменьшает размер образа
  2. Один процесс на контейнер - следуйте принципам микросервисов
  3. Используйте официальные образы - они лучше поддерживаются
  4. Минимизируйте слои - объединяйте RUN команды
  5. Используйте конкретные версии тегов - не используйте latest
  6. Не храните данные в контейнере - используйте volumes
  7. Ограничивайте ресурсы - CPU и память
  8. Сканируйте образы на уязвимости

10. Практическое задание

Задача:

Создайте Docker-контейнер для простого Django приложения

Шаги:

  1. Создайте новый Django проект
  2. Напишите Dockerfile
  3. Создайте docker-compose.yml с PostgreSQL
  4. Настройте переменные окружения
  5. Запустите и протестируйте

Пример Dockerfile для Django:

FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

11. Отладка и устранение проблем

# Проверка логов
docker logs <container_id>

# Интерактивный доступ
docker exec -it <container_id> /bin/bash

# Проверка запущенных процессов
docker top <container_id>

# Проверка использования ресурсов
docker stats

# Инспекция контейнера
docker inspect <container_id>

# Просмотр истории сборки
docker history <image_name>

12. Полезные ресурсы

Заключение

Docker значительно упрощает разработку и деплой Python-приложений. Начните с простых контейнеров и постепенно осваивайте более сложные сценарии с Docker Compose и оркестраторами. Практикуйтесь на реальных проектах для лучшего понимания!