← Назад к вопросам

В проектах на Django работа с базой данных осуществлялась через локальную настройку окружения или с использованием Docker

2.2 Middle🔥 91 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Работа с БД в Django проектах: локально или Docker?

Отличный практический вопрос. Дам честный ответ из опыта.

Мой текущий подход: Docker + Docker Compose

В последних проектах использую Docker Compose — это стало стандартом, потому что:

Почему Docker Compose выигрывает

1. Окружение dev = окружение prod

# docker-compose.yml
version: '3.8'
services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
  
  web:
    build: .
    environment:
      DATABASE_URL: postgresql://app:secretpassword@db:5432/myapp
    depends_on:
      - db
    ports:
      - "8000:8000"
    volumes:
      - .:/app

volumes:
  postgres_data:

Все разработчики используют одинаковую версию PostgreSQL. На production — та же версия. Нет работает у меня, не работает у него проблем.

2. Новый разработчик начинает работать за 5 минут

# Вместо 30 минут установки:
# - Python 3.11
# - PostgreSQL
# - Redis
# - RabbitMQ
# - Зависимостей

# Новый разработчик просто делает:
git clone <repo>
cd <project>
docker-compose up

# Готово! Все сервисы работают

3. Легко управлять несколькими сервисами

services:
  db:
    image: postgres:15
  
  redis:
    image: redis:7-alpine
  
  rabbitmq:
    image: rabbitmq:3.12-management
  
  web:
    build: .
    depends_on:
      - db
      - redis
      - rabbitmq

Одна команда запускает ВСЁ:

docker-compose up

Без Docker пришлось бы запускать 4 разных приложения вручную.

История: Как я пришёл к Docker

Проект 1: Локальная БД (2019)

# Установка PostgreSQL локально
brew install postgresql
pg_ctl -D /usr/local/var/postgres start

# Проблемы:
# 1. Версия отличается от production (у меня 11, на сервере 13)
# 2. Забыл запустить PostgreSQL — тесты падают
# 3. Новый разработчик потратил день на установку
# 4. На Mac и Linux разные пути к БД

Проект 2: Docker (начало 2021)

# Первый раз всё на Docker
docker run -d \
  -e POSTGRES_PASSWORD=secret \
  -p 5432:5432 \
  postgres:13

# Лучше, но:
# - Данные теряются при перезагрузке контейнера
# - Нужно помнить все флаги
# - Управление вручную не масштабируется

Проект 3: Docker Compose (2022 и далее)

version: '3.8'
services:
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:
docker-compose up  # Всё работает!

Это стало стандартом.

Когда всё же использую локальную БД

Да, есть редкие случаи:

1. Быстрый скрипт/прототип

# Если делаю что-то на 1-2 часа
sqlite3 :memory:  # Встроенная БД в памяти

# Или
docker run -d postgres:latest  # Потом удалю

2. Работа с данными локально (data science ноутбук)

# jupyter notebook
import sqlite3

conn = sqlite3.connect(':memory:')  # Развиваю идею
df.to_sql('test', conn)

3. Очень простые проекты

# Django + SQLite + работа на localhost
# Для учебных целей, можно без Docker

# Но даже тогда Docker лучше!

Практический пример: Полная setup

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

my-django-app/
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── .env.example
└── myapp/
    ├── manage.py
    ├── settings.py
    └── ...

Dockerfile

FROM python:3.11-slim

WORKDIR /app

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

COPY . .

CMD ["gunicorn", "myapp.wsgi", "-b", "0.0.0.0:8000"]

docker-compose.yml

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-myapp}
      POSTGRES_USER: ${POSTGRES_USER:-app}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secret}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      timeout: 5s
      retries: 5
  
  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
  
  web:
    build: .
    command: >
      sh -c "python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"
    environment:
      DEBUG: "True"
      DATABASE_URL: postgresql://app:secret@db:5432/myapp
      REDIS_URL: redis://redis:6379/0
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  postgres_data:

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

# Первый запуск
git clone <repo>
cd <project>
cp .env.example .env
docker-compose up

# Миграции
docker-compose exec web python manage.py migrate

# Django shell
docker-compose exec web python manage.py shell

# Создание суперюзера
docker-compose exec web python manage.py createsuperuser

# Запуск тестов
docker-compose exec web pytest

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

Работа с БД внутри контейнера

Подключение к PostgreSQL из контейнера

# Способ 1: psql внутри контейнера
docker-compose exec db psql -U app -d myapp

# Способ 2: DBeaver/IDE с localhost:5432
# Просто подключаешься к localhost:5432
# (порт 5432 пробросен через docker-compose)

Миграции

# В контейнере
docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate

# Или в Dockerfile (при build)
RUN python manage.py migrate

Плюсы локальной БД

Есть редкие случаи, когда локально удобнее:

✅ Очень быстрое прототипирование
✅ Меньше overhead на слабых машинах
✅ Проще отладка (можно подключить debugger)
✅ Не нужно знать Docker

Минусы локальной БД

❌ Конфликты версий между разработчиками
Работает у меня синдром
❌ Сложнее для новичков
❌ Отличается от production
❌ Нельзя использовать Redis/RabbitMQ
❌ На Windows есть проблемы (WSL)

Мой совет

Используй Docker Compose в production проекте. Это:

  • Не усложняет разработку
  • Экономит часы на настройку
  • Гарантирует консистентность
  • Облегчает CI/CD
  • Инвестиция в качество проекта

Для учебного проекта — можно локально, но лучше всё равно Docker.

Что я использую сейчас

# Все мои активные проекты:
# - Django + PostgreSQL + Redis + Docker Compose ✅
# - FastAPI + AsyncPG + Redis + Docker Compose ✅
# - Python + SQLite + SQLAlchemy + локально (для скриптов)

# Стандарт для боевого кода: Docker Compose