Введение
Контейнеризация стала обязательным этапом в жизненном цикле веб-приложений. Чтобы перенести проект django в докер, необходимо изолировать окружение, зафиксировать зависимости и стандартизировать процессы сборки. Это устраняет проблему «работает на локальной машине» и ускоряет CI/CD пайплайны.
Подготовка и изоляция окружения
Перед началом работ убедитесь, что все сторонние библиотеки вынесены в requirements.txt. Замените хардкод путей к конфигурационным файлам на переменные окружения. Для успешной миграции проекта потребуется настроить чтение параметров БД из .env файла. Отключите DEBUG-режим в продакшене и настройте ALLOWED_HOSTS.
Создание Dockerfile
Выбирайте Slim-образы для минимизации уязвимостей и размера.
FROM python:3.11-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN addgroup --system django && adduser --system --ingroup django django
USER django
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]
Директива FROM задает базовый слой. Переменные PYTHONDONTWRITEBYTECODE и PYTHONUNBUFFERED критичны для корректной работы Python внутри контейнера. Создание непривилегированного пользователя повышает безопасность.
Оркестрация через Docker Compose
Комбинирование бэкенда, базы данных и кэша выполняется в compose-файле.
version: '3.9'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
- redis
env_file:
- .env
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: appdb
POSTGRES_USER: dbuser
POSTGRES_PASSWORD: strongpass
volumes:
pgdata:
Том pgdata гарантирует сохранность данных при перезапуске контейнеров. Маппинг volumes с точкой позволяет использовать hot-reload, но в production требует отдельного шага collectstatic.
Сравнение подходов к развертыванию
| Параметр | Локальная среда | Контейнерная среда |
|---|---|---|
| Изоляция | Отсутствует | Полная (namespaces) |
| Версионирование | Ручное | Снимки образов (layers) |
| Масштабирование | Сложное | Горизонтальное (replicas) |
| Деплой | Зависит от хоста | Агностичный к ОС |
Завершение миграции проекта
Выполните сборку командой docker compose up —build. Откройте терминал сервиса: docker compose exec web bash. Примените схемы базы данных через manage.py migrate. Проверьте логи через docker compose logs -f web. Данный алгоритм позволяет перенести проект django в докер без потери бизнес-логики и с гарантированной воспроизводимостью.
Вопрос-ответ (FAQ)
Как избежать проблем с правами доступа к файлам?
Запустите контейнер с UID/GID текущего пользователя или используйте многоступенчатую сборку для смены владельца файлов после копирования.
Нужно ли менять код приложения?
Минимально. Достаточно настроить DATABASE_URL для чтения из переменных окружения и отключить debug-режим в продакшене.
Как обновить зависимости при изменении кода?
Используйте volume-маппинг для исходников и пересобирайте образ только при изменении requirements.txt. Для продакшена собирайте образ один раз и развертывайте артефакт.
Обсуждение закрыто.