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 #

AspekLocal DevelopmentProduction
Serverrunservergunicorn / uvicorn
ReloadAuto reloadTidak perlu
Image sizeTidak kritisPenting
Tool debugAktifDibatasi

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 #

  1. Jalankan:

    docker compose up --build
    
  2. Akses aplikasi:

    http://localhost:8000
    
  3. Edit code

  4. Django reload otomatis


Anti-Pattern #

  1. Menggunakan Dockerfile production untuk local
  2. Tidak pakai volume (tidak auto reload)
  3. Menyimpan .env di image
  4. 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact