← Назад к курсу
Использование 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. Лучшие практики
- Используйте .dockerignore - уменьшает размер образа
- Один процесс на контейнер - следуйте принципам микросервисов
- Используйте официальные образы - они лучше поддерживаются
- Минимизируйте слои - объединяйте RUN команды
- Используйте конкретные версии тегов - не используйте latest
- Не храните данные в контейнере - используйте volumes
- Ограничивайте ресурсы - CPU и память
- Сканируйте образы на уязвимости
10. Практическое задание
Задача:
Создайте Docker-контейнер для простого Django приложения
Шаги:
- Создайте новый Django проект
- Напишите Dockerfile
- Создайте docker-compose.yml с PostgreSQL
- Настройте переменные окружения
- Запустите и протестируйте
Пример 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
- Docker Hub - репозиторий образов
- Best practices for Dockerfiles
- Python with Docker
Заключение
Docker значительно упрощает разработку и деплой Python-приложений. Начните с простых контейнеров и постепенно осваивайте более сложные сценарии с Docker Compose и оркестраторами. Практикуйтесь на реальных проектах для лучшего понимания!