Подготовка приложения Django к производству внутри Docker весьма полезна для разработчиков. Это сводит к минимуму проблемы с настройкой и развертыванием. Это позволяет разработчикам сосредоточиться на том, что важно, т.е. на разработке и бизнес-логике.


Оглавление

  1. Предпосылка
  2. Введение
  3. Конфигурация проекта
  4. Разделение настроек для разных сред
  5. Переменные среды
  6. Конфигурация Постгреса

    1. Перед запуском Django убедитесь, что Postgres исправен.
  7. Конфигурация сельдерея и Redis
  8. Настройка Docker Compose для производства
  9. Вывод


Предпосылка

В этом руководстве предполагается, что вы знакомы со следующими технологиями:


Введение

Это руководство предназначено для того, чтобы помочь вам начать и организовать ваш проект Django для работы в различных средах, главным образом, для разработки и производства. Затем вы можете взять этот шаблон, изменить его в соответствии со своими конкретными требованиями и, наконец, развернуть его у поставщика облачных услуг, такого как AWS, Azure или Digital Ocean, по вашему выбору.

Примечание:- Если вы столкнетесь с какими-либо проблемами во время обучения, вы можете проверить код в Репозиторий GitHub



Конфигурация проекта

Сначала создайте репозиторий на GitHub. Инициализируйте репозиторий с помощью README файл и .gitignore шаблон для Python.

Репозиторий GH

Теперь на своем компьютере откройте терминал и выполните следующие команды, чтобы настроить и открыть проект.

mkdir django-docker-template
cd django-docker-template
git clone <link-to-repo> .
code .
Войти в полноэкранный режим

Выйти из полноэкранного режима

В корневом каталоге вашего проекта создайте файл с именем requirements.txt

touch requirements.txt
Войти в полноэкранный режим

Выйти из полноэкранного режима

и добавьте следующие зависимости:

celery==5.2.7
Django==4.1.2
gunicorn==20.1.0
psycopg2-binary==2.9.5
python-decouple==3.6
redis==4.3.4
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем создайте Dockerfile

touch Dockerfile
Войти в полноэкранный режим

Выйти из полноэкранного режима

и добавьте следующий фрагмент:

FROM python:3.10.2-slim-bullseye

ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .
Войти в полноэкранный режим

Выйти из полноэкранного режима

Затем создайте docker-compose.yml файл:

touch docker-compose.yml
Войти в полноэкранный режим

Выйти из полноэкранного режима

и добавить web служба внутри него:

version: "3.9"

services:
  web:
    build: .
    volumes:
      - .:/code
    env_file:
      - ./.env
    ports:
      - 8000:8000
Войти в полноэкранный режим

Выйти из полноэкранного режима

Наконец, создайте .dockerignore файл, чтобы Docker проигнорировал некоторые файлы, тем самым ускорив процесс сборки вашего образа.

touch .dockerignore
Войти в полноэкранный режим

Выйти из полноэкранного режима

Добавьте внутрь него следующее:

.venv
.git
.gitignore
Войти в полноэкранный режим

Выйти из полноэкранного режима

Отлично, создайте свой образ, выполнив следующую команду:

docker-compose build
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это займет некоторое время. Теперь вы можете использовать этот образ для создания проекта Django.

docker-compose run --rm web django-admin startproject config .
Войти в полноэкранный режим

Выйти из полноэкранного режима


Разделение настроек для разных сред

Важно учитывать различные среды/режимы, в которых будет работать ваш проект: обычно это разработка и производство. Однако вы можете применить аналогичную логику для других сред, которые вам, возможно, потребуется включить.

Вы можете разделить свои настройки, чтобы указать, в какой среде работает ваш проект, аналогично тому, что представлено ниже:

base.py будет содержать общие настройки, используемые независимо от среды. Следовательно, скопируйте все содержимое settings.py который Django создал по умолчанию в settings/base.py и удалить settings.py так как он больше не нужен.

Затем импортируйте base.py в обеих средах. Параметры среды будут обновлены позже.


Переменные среды

Использование переменных среды позволяет описывать различные среды. python decouple — один из наиболее часто используемых пакетов для строгого отделения настроек от исходного кода. Этот пакет добавлен ранее в requirements.txt так что просто создайте .env файл в корневом каталоге вашего проекта:

И добавьте следующие переменные:

Обновите свои настройки соответствующим образом:

DJANGO_SETTINGS_MODULE сообщает Django, какой параметр использовать. Предоставляя его значение в переменной окружения, manage.py сможет автоматически использовать соответствующие настройки для различных сред. Поэтому обновите manage.py следующим образом:

Теперь, каковы некоторые из возможных настроек, специфичных для среды? Вот некоторые из них:

1) Эл. адрес

Вы можете использовать серверную часть консоли в режиме разработки для записи электронных писем в стандартный вывод.

В рабочем режиме используйте серверную часть SMTP, такую ​​как SendGrid, Mailgun и т. д.

2) Медиа и статические файлы

В рабочем режиме вы можете использовать такие сервисы, как AWS S3, для обслуживания ваших статических и мультимедийных файлов. В таких сценариях удобно иметь несколько настроек.

Затем вы можете добавить конфигурации, связанные с AWS, в production.py

3) Кэширование

В идеале вам не нужно кешировать свой сайт в процессе разработки, поэтому вы можете отдельно добавить сервер кеша, такой как Redis, в production.py файл

Кроме того, вы можете добавлять приложения, промежуточное ПО и т. д. отдельно для своих сред.


Конфигурация Постгреса

Чтобы настроить Postgres, сначала нужно добавить новую службу в docker-compose.yml файл:

Далее обновите .env файл для включения переменных, связанных с базой данных:

Наконец, обновите настройки, чтобы использовать СУБД Postgres вместо механизма SQLite, который Django использует по умолчанию.

Примечание:- Вы можете использовать разные базы данных для разработки и производства. Если это так, вы можете удалить DATABASES установка от base.py и добавить различные базы данных для разработки и производства.

Большой! Теперь заново создайте контейнер, чтобы убедиться, что то, что у вас есть, работает.

Также убедитесь, что миграции применяются:


Перед запуском Django убедитесь, что Postgres исправен.

Обычно при работе с Postgres и Django в Docker web служба (Django) пытается подключиться к db обслуживание, даже когда db сервис не готов принимать соединения. Чтобы решить эту проблему, вы можете создать короткий bash-скрипт, который будет использоваться в Docker. ТОЧКА ВХОДА команда.

В корневом каталоге вашего проекта создайте файл с именем entrypoint.sh

touch entrypoint.sh
Войти в полноэкранный режим

Выйти из полноэкранного режима

Добавьте следующий сценарий, чтобы прослушивать порт базы данных Postgres, пока он не будет готов принимать соединения, а затем применять миграции и собирать статические файлы.

#!/bin/sh

echo 'Waiting for postgres...'

while ! nc -z $DB_HOSTNAME $DB_PORT; do
    sleep 0.1
done

echo 'PostgreSQL started'

echo 'Running migrations...'
python manage.py migrate

echo 'Collecting static files...'
python manage.py collectstatic --no-input

exec "$@"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Обновите права доступа к файлу локально

chmod +x entrypoint.sh
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь, чтобы использовать этот скрипт, вам нужно иметь Netcat установлен на вашем образе. Поэтому обновите Dockerfile чтобы установить эту сетевую утилиту и использовать сценарий bash в качестве команды точки входа Docker.

FROM python:3.10.2-slim-bullseye

ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY ./requirements.txt .

RUN apt-get update -y && \
    apt-get install -y netcat && \
    pip install --upgrade pip && \
    pip install -r requirements.txt

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

COPY . .

ENTRYPOINT ["/code/entrypoint.sh"]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Перестройте образ и раскрутите контейнеры.

docker-compose up --build
Войти в полноэкранный режим

Выйти из полноэкранного режима

Перейти к


Конфигурация сельдерея и Redis

Celery выполняет трудоемкие задачи асинхронно в фоновом режиме, чтобы ваше веб-приложение могло продолжать быстро реагировать на запросы пользователей. Используйте Redis вместе с Celery, так как он может одновременно служить и брокером сообщений, и серверной частью базы данных.

Добавьте сервисы Redis и Celery в docker-compose.yml

При этом обновите web обслуживание так же:

После того, как это настроено, перейдите в папку конфигурации и создайте файл с именем celery.py

Затем добавьте в него следующий фрагмент:

Далее отправляйтесь в base.py и добавьте следующую конфигурацию внизу:

Обновлять .env чтобы включить указанные выше переменные среды:

Окончательное обновление входит в __init__.py файл папки конфигурации:

Проверьте еще раз:


Настройка Docker Compose для производства

Встроенный сервер Django не подходит для производства, поэтому вам следует использовать сервер WSGI производственного уровня, такой как Gunicorn, в производственной среде.

Кроме того, вам также следует рассмотреть возможность добавления Nginx в качестве обратного прокси-сервера для Gunicorn и обслуживания статических файлов.

Поэтому создайте файл с именем docker-compose.prod.yml в корне вашего проекта и добавьте/обновите следующие сервисы:

В приведенном выше файле стоит отметить несколько вещей:

Не забудьте обновить .env включить NGINX_PORT переменная окружения:

Затем в корневом каталоге проекта создайте следующую папку и файлы:

Обновите соответствующие файлы:

Протестируйте производственную установку локально:

Перейти к Статические файлы также должны загружаться корректно.


Вывод

Это руководство провело вас через контейнеризацию вашего приложения Django как для локальной разработки, так и для производства. В дополнение к простоте развертывания в контейнерах локальная работа внутри Docker также экономит время, поскольку сводит к минимуму настройку, которую необходимо настроить на вашем компьютере.

Если вы где-то заблудились на протяжении всего руководства, ознакомьтесь с проектом на Гитхаб

Удачного кодирования! 🖤