Yazılım

Django Uygulamanizi Docker ile Production'a Tasiyin

Django projelerinizi Docker Compose ile nasil production ortamina tasiyacaginizi adim adim anlatiyorum.

Ragıb Görmez
| 26 Mart 2026 | 2 dakika okuma | 18 görüntülenme
Django Uygulamanizi Docker ile Production'a Tasiyin

Django projelerinizi gelistirme ortamindan production ortamina tasimak, ilk basta korkutucu gorunebilir. Ancak Docker ve Docker Compose sayesinde bu sureci oldukca basit ve tekrarlanabilir hale getirebilirsiniz.

Bu yazida, bir Django uygulamasini Docker ile nasil deploy edeceginizi adim adim gosterecegim.

Neden Docker?

Docker, uygulamanizi ve tum bagimliklarini bir container icinde paketlemenizi saglar. Bu sayede:

  • Tutarlilik: "Benim bilgisayarimda calisiyor" sorunu ortadan kalkar
  • Izolasyon: Her servis kendi container'inda calisir
  • Olceklenebilirlik: Kolayca yatay olceklendirme yapabilirsiniz
  • Tekrarlanabilirlik: Ayni ortami her yerde olusturabilirsiniz

Proje Yapisi

Ornek proje yapimiz su sekilde olacak:

myproject/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── manage.py
├── config/
│   ├── settings/
│   │   ├── base.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py
└── apps/
    └── ...

1. Dockerfile Olusturma

Ilk adim olarak bir Dockerfile olusturalim:

FROM python:3.13-slim

# Sistem bagimliklarini yukle
RUN apt-get update && apt-get install -y \
    libpq-dev \
    libjpeg-dev \
    zlib1g-dev \
    && rm -rf /var/lib/apt/lists/*

# Calisma dizinini ayarla
WORKDIR /app

# Bagimliliklari kopyala ve yukle
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Proje dosyalarini kopyala
COPY . .

# Statik dosyalari topla
RUN python manage.py collectstatic --noinput

EXPOSE 3000

CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:3000", "--workers", "3"]

Not: --no-cache-dir flagi Docker image boyutunu kucultmeye yardimci olur.

2. Docker Compose Yapilandirmasi

docker-compose.yml dosyasinda servislerimizi tanimlayalim:

services:
  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myproject
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: ${DB_PASSWORD}

  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      DJANGO_SETTINGS_MODULE: config.settings.production
      SECRET_KEY: ${SECRET_KEY}
      DB_HOST: db
    depends_on:
      - db

volumes:
  postgres_data:

3. Production Ayarlari

Production icin ayarlari ayri bir dosyada tutuyoruz:

# config/settings/production.py
from .base import *

DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': config('POSTGRES_DB'),
        'USER': config('POSTGRES_USER'),
        'PASSWORD': config('POSTGRES_PASSWORD'),
        'HOST': config('DB_HOST', default='db'),
        'PORT': '5432',
    }
}

# Guvenlik ayarlari
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True

4. Gunicorn Yapilandirmasi

Gunicorn, production ortami icin WSGI HTTP server'dir. Worker sayisini su formule gore ayarlayabilirsiniz:

workers = (2 * CPU_CORES) + 1

Ornegin 2 cekirdekli bir sunucu icin 5 worker ideal olacaktir.

5. Veritabani Migration'lari

Container basladiginda migration'larin otomatik calismasini saglamak icin startup komutunu guncelleyin:

python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn config.wsgi:application --bind 0.0.0.0:3000

Sonuc

Docker ile Django deployment sureci:

  1. Dockerfile ile uygulama imajini olusturun
  2. docker-compose.yml ile servisleri tanimlayin
  3. Environment variables ile hassas bilgileri yonetin
  4. Gunicorn ile production WSGI server kullamin

Bu yapiyi bir kez kurdugunuzda, her yeni deploy isleminde sadece docker compose up --build komutunu calistirmaniz yeterli olacaktir.


Sorulariniz veya eklemek istedikleriniz varsa, iletisim sayfasindan bana ulasabilirsiniz.

Bu Yazıyı Paylaş

Önceki Yazı

Yakında...

Sonraki Yazı

Yakında...