Docker va Docker Compose Bilan Django Loyihasini Sozlash

Muallif: Javohir Abdullayev · · Server va DevOps

Docker va Docker Compose Bilan Django Loyihasini Sozlash

Kirish: Nega aynan Docker?

Dasturchilar orasida eng ko'p uchraydigan hazillardan biri — "Mening kompyuterimda ishlayotgan edi" jumlasidir. Har xil operatsion tizimlar, Python versiyalari va ma'lumotlar bazasi drayverlari o'rtasidagi farqlar loyihani boshqa kompyuterda yoki serverda ishga tushirishda kutilmagan xatoliklarga olib keladi.

Ushbu muammoni tubdan hal qilish uchun Docker va Docker Compose vositalaridan foydalanamiz. Ushbu amaliy qo'llanmada biz Django loyihasi va PostgreSQL ma'lumotlar bazasini Docker yordamida konteynerlashtirishni noldan boshlab bosqichma-bosqich ko'rib chiqamiz.

1-qadam: Loyiha tuzilmasini tayyorlash

Dastlab loyihamiz uchun alohida katalog yaratamiz va kerakli fayllarni joylashtiramiz. Loyihangizning ildiz papkasi quyidagicha ko'rinishda bo'ladi:

myproject/
├── docker-compose.yml
├── Dockerfile
├── .dockerignore
├── requirements.txt
└── src/
    ├── manage.py
    └── myproject/

Dastlab requirements.txt fayliga Django va PostgreSQL bilan ishlash uchun drayverni yozamiz:

Django>=5.0,<5.1
psycopg2-binary>=2.9.9
gunicorn>=21.2.0

2-qadam: Dockerfile yaratish

Dockerfile — bu bizning Django ilovamiz ishlaydigan muhitning (image) retsepti hisoblanadi. Loyiha ildizida Dockerfile nomli fayl oching va unga quyidagi ko'rsatmalarni kiriting:

FROM python:3.11-slim

# Python buferlashini o'chirish (loglar darhol ko'rinishi uchun)
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

WORKDIR /app

# Tizim paketlarini yangilash
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    && rm -rf /var/lib/apt/lists/*

# Bog'liqliklarni o'rnatish
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# Loyiha kodini nusxalash
COPY . /app/

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Ortiqcha fayllar konteyner ichiga tushib qolmasligi uchun .dockerignore faylini ham yaratishni unutmang:

__pycache__
*.pyc
*.pyo
*.pyd
.git
.env
venv/
env/

3-qadam: Docker Compose orqali xizmatlarni bog'lash

Bizga Django ilovasi bilan bir qatorda alohida PostgreSQL bazasi ham kerak bo'ladi. Ularning ikkalasini bitta tarmoqda qulay boshqarish uchun docker-compose.yml faylidan foydalanamiz:

version: '3.8'

services:
  db:
    image: postgres:16-alpine
    container_name: django_postgres_db
    environment:
      POSTGRES_DB: myproject_db
      POSTGRES_USER: postgres_user
      POSTGRES_PASSWORD: secretpassword123
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  web:
    build: .
    container_name: django_web_app
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    environment:
      - DB_NAME=myproject_db
      - DB_USER=postgres_user
      - DB_PASSWORD=secretpassword123
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      - db

volumes:
  postgres_data:

4-qadam: Django sozlamalarini (settings.py) moslashtirish

Django Docker konteyneridagi PostgreSQL bilan bog'lanishi uchun settings.py faylidagi DATABASES konfiguratsiyasini muhit o'zgaruvchilari (Environment Variables) orqali o'qiydigan qilib o'zgartiramiz:

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME', 'myproject_db'),
        'USER': os.environ.get('DB_USER', 'postgres_user'),
        'PASSWORD': os.environ.get('DB_PASSWORD', 'secretpassword123'),
        'HOST': os.environ.get('DB_HOST', 'localhost'),
        'PORT': os.environ.get('DB_PORT', '5432'),
    }
}

5-qadam: Loyihani ishga tushirish va tekshirish

Barcha konfiguratsiyalar tayyor bo'lgach, terminalda quyidagi buyruqni bering:

docker compose up --build

Ushbu buyruq Python va PostgreSQL obrazlarini yuklab oladi, Dockerfile orqali Django ilovasini quradi va ikkala konteynerni ishga tushiradi.

Migratsiyalarni bajarish va superuser yaratish uchun alohida terminal oynasida konteyner ichiga buyruq yuboramiz:

# Migratsiyalarni amalga oshirish
docker compose exec web python manage.py migrate

# Superuser yaratish
docker compose exec web python manage.py createsuperuser

Endi brauzeringizda http://localhost:8000 manziliga kirsangiz, Django tabrik sahifasi, http://localhost:8000/admin manzilida esa boshqaruv paneli ishlayotganiga guvoh bo'lasiz.

Foydali tavsiyalar va xulosa

  • Live-reload: volumes: - .:/app qatori yordamida kodingizga o'zgartirish kiritishingiz bilan konteynerdagi server avtomatik qayta ishga tushadi.
  • Ma'lumotlar xavfsizligi: postgres_data hajmi (volume) tufayli konteyner o'chirilsa ham bazadagi ma'lumotlar saqlanib qoladi.
  • Fayl hajmini kichraytirish: Dockerfile uchun python:3.11-slim yoki alpine asosidagi yengil obrazlardan foydalanish tavsiya etiladi.

Docker va Docker Compose orqali Django loyihangizni sozlash jamoaviy ishlashni osonlashtiradi va serverga yuklash (deploy) jarayonidagi muammolarni deyarli butunlay yo'qotadi.

Teglar: #Docker #Django #DevOps #PostgreSQL #Docker Compose