Настройка проекта Django с помощью Docker и Docker Compose

Автор: Javohir Abdullayev · · Сервер и DevOps

Настройка проекта Django с помощью Docker и Docker Compose

Введение: Почему именно Docker?

Одна из самых популярных шуток среди разработчиков — «На моем компьютере все работало». Различия между операционными системами, версиями Python и драйверами баз данных часто приводят к непредвиденным ошибкам при запуске проекта на другом компьютере или сервере.

Для фундаментального решения этой проблемы мы используем Docker и Docker Compose. В этом практическом руководстве мы шаг за шагом с нуля разберем процесс контейнеризации проекта Django и базы данных PostgreSQL с помощью Docker.

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

Сначала создадим отдельную директорию для нашего проекта и разместим необходимые файлы. Корневая папка проекта будет выглядеть следующим образом:

myproject/
├── docker-compose.yml
├── Dockerfile
├── .dockerignore
├── requirements.txt
└── src/
    ├── manage.py
    └── myproject/

Для начала запишем в файл requirements.txt зависимости для работы с Django и PostgreSQL:

Django>=5.0,<5.1
psycopg2-binary>=2.9.9
gunicorn>=21.2.0

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

Dockerfile — это рецепт сборки окружения (образа), в котором будет работать наше Django-приложение. Создайте файл с именем Dockerfile в корне проекта и добавьте следующие инструкции:

FROM python:3.11-slim

# Отключение буферизации Python (чтобы логи отображались сразу)
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app

# Обновление системных пакетов
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    && rm -rf /var/lib/apt/lists/*

# Установка зависимостей
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# Копирование кода проекта
COPY . /app/

EXPOSE 8000

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

Чтобы лишние файлы не попадали внутрь контейнера, не забудьте также создать файл .dockerignore:

__pycache__
*.pyc
*.pyo
*.pyd
.git
.env
venv/
env/

Шаг 3: Связывание сервисов с помощью Docker Compose

Помимо приложения Django, нам также потребуется отдельная база данных PostgreSQL. Чтобы удобно управлять ими обоими в единой сети, мы используем файл docker-compose.yml:

version: '3.8'

services:
  db:
    image: postgres:16-alpine
    container_name: django_postgres_db
    environment:
      POSTGRES_DB: myproject_db
      POSTGRES_USER: postgres_user
      POSTGRES_PASSWORD: secretpassword123
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  web:
    build: .
    container_name: django_web_app
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    environment:
      - DB_NAME=myproject_db
      - DB_USER=postgres_user
      - DB_PASSWORD=secretpassword123
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      - db

volumes:
  postgres_data:

Шаг 4: Настройка параметров Django (settings.py)

Чтобы Django мог подключиться к PostgreSQL внутри Docker-контейнера, изменим конфигурацию DATABASES в файле settings.py так, чтобы параметры считывались из переменных окружения (Environment Variables):

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME', 'myproject_db'),
        'USER': os.environ.get('DB_USER', 'postgres_user'),
        'PASSWORD': os.environ.get('DB_PASSWORD', 'secretpassword123'),
        'HOST': os.environ.get('DB_HOST', 'localhost'),
        'PORT': os.environ.get('DB_PORT', '5432'),
    }
}

Шаг 5: Запуск и проверка проекта

Когда все конфигурации готовы, выполните следующую команду в терминале:

docker compose up --build

Эта команда скачает образы Python и PostgreSQL, соберет Django-приложение на основе Dockerfile и запустит оба контейнера.

Для выполнения миграций и создания суперпользователя отправьте команды внутрь контейнера в отдельном окне терминала:

# Применение миграций
docker compose exec web python manage.py migrate

# Создание суперпользователя
docker compose exec web python manage.py createsuperuser

Теперь, если вы откроете в браузере http://localhost:8000, то увидите приветственную страницу Django, а по адресу http://localhost:8000/admin будет доступна панель администратора.

Полезные рекомендации и заключение

  • Live-reload: Благодаря строке volumes: - .:/app сервер внутри контейнера автоматически перезагружается при внесении изменений в код.
  • Сохранность данных: Том (volume) postgres_data гарантирует, что данные в базе сохранятся даже после удаления контейнера.
  • Оптимизация размера: Для Dockerfile рекомендуется использовать легковесные базовые образы на основе python:3.11-slim или alpine.

Настройка проекта Django с помощью Docker и Docker Compose существенно упрощает командную разработку и практически полностью устраняет проблемы, возникающие при развертывании (деплое) на сервере.

Теги: #Docker #Django #DevOps #PostgreSQL #Docker Compose