Переглянути пости за тегами

Налаштування середовища розробки Django за допомогою Docker

  • 4 хв читання
  • 24 Чер, 2024

Зі зростанням популярності контейнеризації у веб-розробці, Docker став незамінним інструментом для розробників. Docker дозволяє безперешкодно керувати залежностями та середовищами, що дає можливість розробникам зосередитися на написанні коду. У цій статті ми покажемо вам, як налаштувати середовище розробки Django за допомогою Docker.

Передумови

Перед початком переконайтеся, що на вашій системі встановлені наступні інструменти:

  • Docker: Відвідайте офіційний веб-сайт Docker, щоб завантажити та встановити Docker Desktop.

  • Docker Compose: Зазвичай включено в Docker Desktop, встановіть окремо, якщо його немає.

Спочатку створимо папку для нашого проєкту та налаштуємо структуру для проєкту:

/app
   /docker                 # # папка для налаштувань docker
       nginx.conf          # конфігураційний файл для nginx 
       python.Dockerfile   # dockerfile для python 
   /pgdata                 # папка для postgres volume, порожня папка
   /src                    # папка, де буде розміщено код вашого сайту
   .env                    # конфігураційні значення для проекту
   docker-compose.yml      # файл конфігурації docker з сервісами
   requirements.txt        # пакети, які потрібні для проекту
   

Крок 1: Налаштування Docker середовища для Python

Створення .env файла з основними налаштуваннями проекта

# .env

DOCKER_HTTP_PORT=80            # стандартний порт для http
DOCKER_HTTPS_PORT=443          # стандартний порт для https

DJANGO_PROJECT_NAME=project    # назва проекту, при потребі можна змінювати

NGINX_CONF_PATH='./docker/nginx.conf' # шлях до конфігураційного файлу nginx

# Доступ до бази даних
DB_USER=                       # назва користувача бази даних
DB_PASSWORD=                   # пароль для користувача бази даних
DB_DATABASE=                   # назва бази даних
DB_HOST=postgres               # назва сервісу в docker-compose.yml
DB_PORT=5432                   # стандартний порт для postgres

ADMINER_DB_PORT=8081           # порт для веб доступу до postgre адмін панелі

У папці docker вашого проєкту створіть файл під назвою python.Dockerfile. Цей файл визначає конфігурацію для нашого Docker контейнера. Додайте наступний вміст до вашого python.dockerfile:

# /docker/python.Dockerfile

FROM python:3.12-alpine

ENV PYTHONUNBUFFED 1
ENV PYTHONDONTWRITEBYTECODE 1

RUN apk upgrade && apk update \
    && apk add gcc python3-dev musl-dev \
    jpeg-dev gettext zlib-dev py3-setuptools \
    mariadb-connector-c-dev mariadb-dev

RUN apk del libressl
RUN apk add openssl
RUN apk fix

#libressl-dev
RUN apk add libffi-dev cargo

RUN mkdir /app
WORKDIR /app
COPY ./src /app

COPY ./requirements.txt /app/requirements.txt
# Install any required dependencies
RUN pip install --upgrade pip && pip install -r requirements.txt


# Expose port 8000 for Gunicorn
EXPOSE 8000

Цей python.dockerfile створює Docker контейнер з Python 3.12 та встановлює необхідні залежності для запуску проєкту Django.

Створіть файл requirements.txt і добавте пакети для проекту

# requirements.txt

Django
gunicorn
psycopg2-binary

Крок 2: Налаштування Docker середовища для Nginx

У папці docker створіть файл nginx.conf та вставте наступну конфігурацію сервера Nginx:

# /docker/nginx.conf

# Define the upstream server (Gunicorn)
upstream web {
    server web:8000;
}

server {
    listen 80;
    server_name localhost;
    client_max_body_size 50M;
    client_body_buffer_size 50M;

    location /static/ {
        alias /static/; 
        expires 30d;
    }

    location /media/ {
        alias /media/;
        expires 30d;

    }

    location / {
        proxy_pass http://web;   # назва нашого сервісу в docker-compose.yml
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}

 

Крок 3: Створення файлу Docker Compose

У кореневій папці вашого проєкту створіть файл docker-compose.yml. Цей файл дозволяє нам визначати та керувати Docker додатками з кількома контейнерами. Вставте наступний вміст:

# docker-compose.yml

services:

  web:
    build: 
      context: .
      dockerfile: ./docker/python.Dockerfile
    command: gunicorn ${DJANGO_PROJECT_NAME}.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./src:/app:delegated
    expose:
      - 8000
    env_file:
      - .env
    restart: always


  nginx:
    image: nginx:latest
    volumes:
      - ${NGINX_CONF_PATH}:/etc/nginx/conf.d/default.conf
      - ./src/static:/static:delegated
      - ./src/media:/media:delegated
    ports:
      - "${DOCKER_HTTP_PORT}:80"
      - "${DOCKER_HTTPS_PORT}:443"
    env_file:
      - .env
    restart: always
    depends_on:
      - web

  postgres:
    image: postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=${DB_DATABASE}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}

  adminer:
    image: adminer
    restart: always
    ports:
      - ${ADMINER_DB_PORT}:8080

volumes:
  pgdata:

Цей `docker-compose.yml` файл створює три сервіси: один для Python (Django), один для PostgreSQL і один для Nginx. Він також визначає Docker мережу, яку використовують ці сервіси для спілкування.

Крок 4: Збірка Docker контейнерів

Тепер ми готові зібрати наші Docker контейнери. З кореневої папки вашого Django проєкту виконайте наступну команду:

docker compose build

 

Крок 5: Створення нового проєкту Django

Нам потрібно створити новий проєкт Django. Перейдіть до директорії, де ви бажаєте створити ваш проєкт, та виконайте наступну команду:

docker compose run --rm web django-admin startproject project .

Якщо вам потрібно виконати команди керування Django, ви можете використовувати:

docker compose run --rm web python manage.py

Запуск Docker контейнерів

docker compose up -d

Можна перевірити чи доступний проект. Якщо DOCKER_HTTP_PORT не 80, то вкінці потрібно дописати номер порту:

http://localhost

6. Налаштування Django  проекту

Додавання STATIC_ROOT для статичних файлів в проекті і налаштування доступу до бази даних в файлі settings.py:

# /src/project/settings.py

import os

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

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

 

7. Виконання стандартних міграцій бази даних для проекту

docker compose run --rm web python manage.py migrate

Перезапуск проекту

docker compose up -d --build

Створення користувача для адмін панелі:

docker compose run --rm web python manage.py createsuperuser

Після цього можна перевірити доступ до адмін панелі Django:

http://localhost/admin

8. Обробка статичних файлів

Додайте рядки для ENTRYPOINT у python.Dockerfile, який виконує команду для статичних файлів:

# /docker/python.Dockerfile

COPY ./docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

Створюємо файл entrypoint.sh в папці docker з наступним вмістом:

#!/bin/sh

python manage.py collectstatic --noinput

exec "$@"

Перезапуск проекту

docker compose up -d --build

Або як альтернативу можна запустити наступну команду:

docker compose run --rm web python manage.py collectstatic

Доступ до повного проекту

Щоб отримати повний проект, відвідайте GitHub репозиторій