نحوه Dockerize کردن Django و Postgre - برای محیط development

1402/04/31 | 648 |
django

در این پست به نحوه داکرایز کردن پروژه های جنگو خواهیم پرداخت و در ادامه به راه کار های موجود و یک قالب آماده برای پیاده سازی پروژه های جنگو را به شما معرفی خواهیم کرد. در نظر داشته باشید که برای درک این موضوع نیاز به یادگیری داکر خواهید داشت و می بایست تا حد خیلی خوبی به ساختار ایجاد Dockerfile و همچنین استفاده از docker-compose اشراف داشته باشید

 

پیاده سازی پروژه های جنگو با قالب آماده من

 
لینک رپو: 
 
برای انجام داکرایزشن نیاز به نصب بودن سرویس های زیر خواهید داشت:
  1. python 
  2. docker

فاز های توسعه نرم افزار

فرایند توسعه، تست و اجرای یک نرم‌افزار به طور کلی شامل سه فاز اصلی است: توسعه، استیج و پروداکشن. در ادامه به توضیح هر یک از این فازها می‌پردازیم:

۱. فاز توسعه: در این فاز، توسعه‌دهندگان به طور مداوم کد نویسی می‌کنند و قابلیت‌های جدیدی را به نرم‌افزار اضافه می‌کنند. در این فاز، اکثر کارها در محیط توسعه‌یافته و در دسترس توسعه‌دهندگان صورت می‌گیرد. در این فاز، توسعه‌دهندگان باید به طور مداوم کد نویسی و تست واحد‌های خود را انجام دهند تا از عملکرد درست و پایدار نرم‌افزار اطمینان حاصل کنند.

۲. فاز استیج: در این فاز، نرم‌افزار به صورت کامل تست می‌شود و همه قابلیت‌ها و خصوصیات آن مورد بررسی قرار می‌گیرد. در این فاز، تست‌های عملکردی، تست‌های واحد، تست‌های انتقال و تست‌های سیستمی انجام می‌شود. برای اطمینان از کیفیت نرم‌افزار، تست‌های مختلف در این فاز اجرا می‌شود و هر گونه مشکل و ایراد در نرم‌افزار شناسایی و رفع می‌شود.

۳. فاز پروداکشن: در این فاز، نرم‌افزار به صورت کامل آماده ارائه به مشتریان و کاربران است. در این فاز، نرم‌افزار در محیط واقعی کاربران اجرا می‌شود و هر گونه مشکل و ایراد در عملکرد آن باید به سرعت رفع شود. در این فاز، نگهداری و پشتیبانی از نرم‌افزار نیز بسیار مهم است.

به طور کلی، هر یک از این فازها به منظور اطمینان از کیفیت و عملکرد درست نرم‌افزار بسیار مهم است. همچنین، این فازها باید به صورت مداوم و بهبود یافته تکرار شوند تا بتوان نرم‌افزار را به صورت مداوم بهبود داد و به عملکرد بهتری دست یافت.

نکته: فرض بر این است که شما در حال حاضر یک پروژه جنگو آماده دارید و می خواهید ساختارش را با docker ادغام نمایید. با این حال ساختار پروژه را بسیار ساده در نظر میگیریم.

نکته: در این پست به پیاده سازی بخش فاز توسعه خواهیم پرداخت.

ساختار پروژه شما در حالت عادی بدین شکل خواهد بود:

│   .gitattributes
│   LICENSE
│   README.md
│   .gitignore
└───core
    │   manage.py
    │
    └───core
        │   asgi.py
        │   error_views.py
        │   settings.py
        │   urls.py
        │   wsgi.py
        └─── __init__.py

برای اینکه بتوانیم 3 فاز پیاده سازی ک نرم افزار را در پپروژه خود در نظر بگیریم آن را به سه بخش dev ، stage و Prod تقسیم خواهید کرد. به طوری که فایل های حاوی برچسب Dev برای توسعه در سیستم local خواهند بود و آن هایی که با Stage برچسب گذاری می شوند برای تست اولیه و Prod برای پیاده سازی نهایی خواهند بود.

فاز توسعه و یا Dev

در این مرحله می خواهیم که پروژه جنگو ما در مرحله debug قرار بگیرد و بتوان تست های لازم را در کنار عملکرد های پایه انجام داد. از جمله عمکلرد ها راه اندازی خود پروژه جنگو است که نیازمند 3 بخش اصلی برای راه اندازی است:

  1. ساخت Dockerfile مربوطه 
  2. ساخت docker-compose
  3. ساخت requirements

ساخت requirements

در این مرحله تمام کتابخانه هایی که در پروژه خود قرار است استفاده نمایید را درج می کنید. نکته مهم در بعضی موارد بهتر است کتابخانه را با ورژن دقیق ذکر کنین و یا بازه در نظر بگیرید.

# requirements.txt

# general  modules
django >3.2,<3.3

# env controls
python-decouple

# database client
psycopg2-binary

ساخت Dockerfile

برای ساخت dockefile مربوط به ایجاد django/python می بایست به شکل زیر عمل کنین:

# dockerfiles/dev/django/Dockerfile

FROM python:3.10-slim-buster

LABEL maintainer="bigdeli.ali3@gmail.com"

ENV PYTHONUNBUFFERED=1

WORKDIR /src/usr/app

COPY requirements.txt .

RUN pip3 install --upgrade pip && pip3 install -r requirements.txt 

COPY ./core .

در فایل بالا ابتدا image مربوطه را تعریف خواهید کرد که کدام نسخه را می خواهید استفاده نمایید. سپس دایرکتوری پیاده سازی پروژه و در مرحله بعد نصب ماژول های پایتون و در آخر کپی کردن پوشه پروژه رو انجام خواهید داد.

ساخت docker-compose

در نهایت برای به اجرا در آوردن سرویس های مورد نیاز می بایست آنها را در فایلی مجتمع تعریف نمایید که پیاده سازی آن به شکل زیر خواهد بود:

# docker-compose.yml

version: "3.9"

services:

  db:
    container_name: db
    image: postgres:alpine
    volumes:
      - ./postgre/data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    restart: always
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 10s
      timeout: 5s
      retries: 5

  backend:
    build:
      context: .
      dockerfile: dockerfiles/dev/django/Dockerfile
    container_name: backend
    command: sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - ./core:/usr/src/app
    ports:
      - "8000:8000"
    environment:
      - SECRET_KEY=test
      - DEBUG=True

    restart: always

    depends_on:
      - db

در فایل مربوطه ابتدا 2 سرویس برای عملکرد خواهیم داشت، یکی برای راه اندازی دیتابیس مربوط به Postgres و دیگری برای راه اندازی پروژه جنگو.

برای راه اندازی postgres کافیست که ابتدا نسخه دیتابیس را در قسمت image تعریف نماییم، سپس یک دایرکتوری از local را به نگهداری persistent دیتا تخصیص می دهیم تا هر بار که سرویس خاموش و روشن و یا غیر فعال می شود دیتای ما در محیط لوکال وجود داشته باشد. سپس متغیر های محیطی یا env ها را تعریف می کنیم که رد اینجا نام دیتابیس و نام کاربری و پسورد خواهند بود که برای اتصال به سرویس مربوطه نیاز خواهیم داشت.سرویس را در حالت Restart قرار یم دهیم تا در صورت شکست و اتفاق دیگر مجدد به حالت فعال برگردد و در نهایت برای اطمینان از به اجرا در آمدن آن قبل از جنگو healthcheck را به سرویس مربوطه اضافه می کنیم.

در بخش سرویس backend ابتدا به فایل Dockerfile مربوطه آدرس دهی می کنیم و سپس تعریف می کنیم که قرار است نقطه آغازین شروع کار کدام پوشه خواهد بود که  نقطه منظور پوشه root است. سپس نام کانتینر را مشخص کرده و در قدم بعد دستور اجرایی که با بالا آمدن سرویس لازم به اجرا است را می نویسیم. سپس پوشه مربوط با پروژه را با پوشه مربوط به داخل کانتینر لینک می کنیم تا در صورت تغییر به صورت هماهنگ تغییرکنند. پورت خروجی کانتینر را به لوکال متصل و قابل دسترس می کنیم. و سپس متغیر های محیطی مورد نیاز پروژه و در نهایت در مد Restart قرار می دهیم تا در صورت خطا مجدد راه اندازی شود. برای اطمینان از وابستگی سرویس به دیتابیس وابستش می کنم.

دسترسی به environment ها

برای دسترسی به enviornment ها تعریف شده در داخل docker-compose کافیست که با استفاده از کتابخانه os.environ و یا python decouple و یا هر ماژول دیگری که برای استفاده از آن راحت ترید اقدام به گرفتن متغیر ها در بخش settings.py برنامه خود کنید. به نمونه درج شده دقت نمایید. بنده شخصا از کتابخانه decouple برای این کار استفاده می کنیم چرا که نحوه عملکرد راحتی تری دارد.

# core/core/settings.py

SECRET_KEY = config("SECRET_KEY", default="test")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = config("DEBUG", cast=bool, default=True)


ALLOWED_HOSTS = config(
    "ALLOWED_HOSTS",
    cast=lambda v: [s.strip() for s in v.split(",")],
    default="*",
)

DATABASES = {
    "default": {
        "ENGINE": config("DB_ENGINE", default="django.db.backends.postgresql"),
        "NAME": config("DB_NAME", default="postgres"),
        "USER": config("DB_USER", default="postgres"),
        "PASSWORD": config("DB_PASS", default="postgres"),
        "HOST": config("DB_HOST", default="db"),
        "PORT": config("DB_PORT", cast=int, default=5432),
    }
}

چینش دایرکتوری و فایل ها

در نهایت پوشه ها به شکل زیر خواهند بود.

│   .gitattributes
│   LICENSE
│   README.md
│   .gitignore
│   docker-compose.yml
│   requirements.txt
├───core
│  │   manage.py
│  │
│  └───core
│      │   asgi.py
│      │   error_views.py
│      │   settings.py
│      │   urls.py
│      │   wsgi.py
│      └─── __init__.py
│
└───dockerfiles
    └───dev
        └───django
               Dockerfile

در اینجا برای اینکه بتوانید پروژه خود را اجرا کنید لازم است تا دستور docker-compose برای build و به اجرا در آوردن سرویس ها را در محل قرار گیری فایل docker-compose.yml اجرا کنید که به شکل زیر خواهد بود.

docker-compose up --build

در صورتی که بخواهید پروژه را متوقف و یا به صورا کامل از بین ببرید می بایست از دستورات زیر استفاده نمایید.

docker-compose stop # برای توقف 

docker-compose down # برای از بین بردن سرویس ها

در نهایت اگر به درستی تغییرات را اعمال کرده باشید می بایست با باز کردن آدرس http://127.0.0.1:8000 و یا http://localhost:800 سرویس جنگو شما ران شده و قابل دسترس باشد.

برای پیاده سازی دو فاز stage و prod در پست بعد ادامه خواهیم داد.


avatar
علی بیگدلی

نویسنده

دوره های من در مکتبخونه

آموزش جنگو پیشرفته
  • سطح: پیشرفته 4.9
آموزش جنگو Django
  • سطح: مقدماتی 4.6

آخرین پست ها

نحوه نصب و پیاده سازی Caprover بر روی لینوکس
نحوه نصب و پیاده سازی Caprover بر روی لینوکس
  • django 1402/11/29
استفاده از محیط docker-compose و dev container در مدیریت پروژه
استفاده از محیط docker-compose و dev container در مدیریت پروژه
  • django 1402/11/22
پایشگر آب و هوا و کنترل از طریق MQTT با نرم افزار IOT Dashboard
پایشگر آب و هوا و کنترل از طریق MQTT با نرم افزار IOT Dashboard
  • micro python 1402/06/11

آخرین دوره ها

آموزش arduino
آموزش Arduino
  • رایگان 78 دانشجو
آموزش رابط گرافیکی Tkinter
آموزش Tkinter
  • رایگان 402 دانشجو