Django #
Django adalah salah satu web framework Python paling matang dan stabil. Namun dalam praktik sehari-hari, pengembangan Django sering menemui masalah klasik:
- Perbedaan versi Python antar developer
- Dependency Python yang konflik
- Setup database yang tidak konsisten
- Environment variable yang tercecer
Di sinilah Docker dan Docker Compose menjadi solusi yang sangat relevan, khususnya untuk local development.
Artikel ini membahas secara mendetail dan rinci bagaimana menyusun:
- Dockerfile yang tepat untuk Django local development
- Docker Compose sebagai local orchestrator
- Workflow development Django yang sehat
- Best practice dan anti-pattern yang sering terjadi
Fokus artikel ini adalah Docker Compose untuk local development, bukan production.
Filosofi Docker Django #
Tujuan Docker di local development Django adalah:
- Menyamakan environment Python & OS
- Mempermudah onboarding developer
- Mendukung iterasi cepat (edit → reload → test)
Bukan untuk:
- Image sekecil mungkin
- Optimasi security ekstrem
- Multi-stage build kompleks
Prinsip sederhananya:
Local development mengutamakan kenyamanan dan konsistensi, bukan optimasi runtime.
Gambaran Arsitektur #
Setup Django lokal umumnya terdiri dari:
- Aplikasi Django
- Database (PostgreSQL / MySQL)
- (Opsional) Redis / Celery
Diagram sederhana:
Developer
|
v
Docker Compose
|
+--> django-app
|
+--> database
Struktur Project Django #
Contoh struktur project Django modern:
.
├── app/
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── manage.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
└── .dockerignore
Karakteristik Dockerfile Django #
| Aspek | Local Development | Production |
|---|---|---|
| Server | runserver | gunicorn / uvicorn |
| Reload | Auto reload | Tidak perlu |
| Image size | Tidak kritis | Penting |
| Tool debug | Aktif | Dibatasi |
Kesalahan paling umum adalah menggunakan Dockerfile production untuk local development.
Dockerfile untuk Django #
Prinsip Dasar #
- Gunakan Python slim image
- Install dependency secara eksplisit
- Gunakan Django development server
- Support auto reload
Contoh Dockerfile #
FROM python:3.12-slim
WORKDIR /app
# Mencegah Python menulis .pyc dan buffering log
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Install dependency OS yang dibutuhkan
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependency
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
# Copy source code
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Penjelasan Dockerfile #
1. Base Image #
FROM python:3.12-slim
- Versi Python eksplisit
- Image relatif kecil
- Cocok untuk development
2. Working Directory #
WORKDIR /app
Menjaga struktur project rapi di container.
3. Environment Variable Python #
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
- Mencegah file
.pyc - Log langsung tampil di stdout
4. Dependency OS #
RUN apt-get update && apt-get install ...
Diperlukan untuk:
- Build dependency Python tertentu
- Koneksi PostgreSQL (
libpq-dev)
5. Install Dependency Python #
COPY requirements.txt .
RUN pip install -r requirements.txt
Langkah ini di-cache Docker sehingga:
- Install lebih cepat saat source code berubah
6. Copy Source Code #
COPY . .
Akan dioverride oleh volume di docker-compose untuk live reload.
7. Development Server #
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
- Auto reload aktif
- Cocok untuk local development
Docker Compose #
Peran Docker Compose #
Docker Compose memungkinkan:
- Menjalankan Django + database bersamaan
- Konfigurasi environment terpusat
- Satu perintah untuk seluruh stack lokal
Contoh docker-compose.yml #
version: "3.9"
services:
web:
container_name: django-app
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- .:/app
env_file:
- .env
depends_on:
- db
command: python manage.py runserver 0.0.0.0:8000
db:
image: postgres:16-alpine
container_name: postgres-db
environment:
POSTGRES_DB: app_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Penjelasan docker-compose.yml #
1. Service Django App #
Port Mapping #
ports:
- "8000:8000"
Akses aplikasi di http://localhost:8000.
Volume Mount #
volumes:
- .:/app
- Sinkronisasi source code
- Auto reload Django aktif
Environment Variable #
env_file:
- .env
Menjaga secret & config di luar source code.
2. Service Database #
- Image resmi PostgreSQL
- Data persisten via volume
Workflow Development #
Jalankan:
docker compose up --buildAkses aplikasi:
http://localhost:8000Edit code
Django reload otomatis
Anti-Pattern #
- Menggunakan Dockerfile production untuk local
- Tidak pakai volume (tidak auto reload)
- Menyimpan
.envdi image - Menganggap Docker = production only
Best Practice #
1. Gunakan .dockerignore
#
.git
__pycache__
.env
*.pyc
2. Jangan Gunakan Gunicorn di Local Dev #
- Gunakan
runserver - Gunicorn hanya untuk production
3. Gunakan Environment Variable untuk Config #
Hindari hardcode di settings.py.
4. Database Retry Logic #
depends_on tidak menjamin DB siap.
Penutup #
Dockerfile dan Docker Compose untuk local development Django seharusnya fokus pada developer experience dan konsistensi environment.
Dengan setup yang tepat:
- Onboarding developer jauh lebih cepat
- Debugging lebih mudah
- Environment lokal seragam