Настройка проекта Django с помощью Docker и Docker Compose
Автор: Javohir Abdullayev · · Сервер и DevOps

Введение: Почему именно 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