В проектах на Django работа с базой данных осуществлялась через локальную настройку окружения или с использованием Docker
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Работа с БД в 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