Как докеризировать приложение django для производственного развертывания с помощью Gunicorn и Nginx

Опубликовано: 24 Января, 2023

Docker — это платформа контейнеризации с открытым исходным кодом, используемая для создания, запуска и управления приложениями в изолированной среде. Контейнер изолирован от другого и объединяет его программное обеспечение, библиотеки и файлы конфигурации. Django — это веб-фреймворк Python с открытым исходным кодом, который можно использовать для быстрой разработки полнофункциональных веб-приложений. В этой статье мы обсудим, как докеризировать приложение Django для целей развертывания.

Примечание. Вы можете посетить Докеризация простого приложения Django, если вы заинтересованы в докеризации своего проекта на этапе разработки.

Предварительные требования: Прежде чем продолжить, убедитесь, что на вашем компьютере установлены узел и докер. При необходимости посетите Руководство по установке Python или Руководство по установке Docker.

Настройка нашего приложения

Для этого урока мы создадим минимальное приложение Django. Инициализируйте новый проект Django, выполнив следующие команды:

$ mkdir docker-django
$ cd docker-django
$ pip3 install Django

Используйте утилиту django-admin для создания нового проекта.

$ djang-admin startproject web
$ cd web

Создайте новое приложение, запустив

$ python3 manage.py startapp api

Создайте очень простое представление в файле api/views.py.

API/views.py

Python3




from django.http import HttpResponse
 
 
def index(request):
    return HttpResponse("Dockerizing Django Application")

Создайте файл urls.py в каталоге API и сопоставьте baseurl с нашим вновь созданным маршрутом.

urls.py

Python3




from django.urls import path
from . import views
 
urlpatterns = [
    path("", views.index, name="index"),
]

Наконец, включите вновь созданный файл URL в основное приложение.

управлять.py

Python3




from django.contrib import admin
from django.urls import include, path
 
urlpatterns = [
    path("", include("api.urls")),
    path("admin/", admin.site.urls),
]

Запустите приложение, выполнив:

$ python3 manage.py runserver

Теперь, если вы перейдете по URL-адресу http://127.0.01:8000, вы увидите следующий вывод:

Ниже представлена структура проекта, показанная на выходном снимке экрана.

Докеризация нашего приложения

Шаг 1: Dockerfile для веб-приложения

В корне нашего проекта реакции создайте Dockerfile для приложения Django.

$ touch Dockerfile

Вставьте следующее в Dockerfile

# Fetching official base image for python
FROM python:3.9-alpine as web

# Setting up the work directory
WORKDIR /home/app/

# Preventing python from writing
# pyc to docker container
ENV PYTHONDONTWRITEBYTECODE 1

# Flushing out python buffer
ENV PYTHONUNBUFFERED 1

# Updating the os
RUN apk update 

# Installing python3
RUN apk add python3-dev

# Copying requirement file
COPY ./requirements.txt ./

# Upgrading pip version
RUN pip install --upgrade pip

# Installing dependencies
RUN pip install gunicorn

# Installing dependencies
RUN pip install --no-cache-dir -r ./requirements.txt

# Copying all the files in our project
COPY . .

Шаг 2: Dockerfile для веб-сервера

Теперь нам нужно настроить Nginx для обслуживания обратных прокси и балансировщиков нагрузки для Gunicorn. В корневом каталоге приложения создайте новую папку для веб-сервера Nginx. Теперь создайте файл конфигурации Nginx для приложения Django.

$ touch nginx.conf

Вставьте следующее содержимое в файл conf.

upstream django_app {
    server web:8000;
}

server {

    listen 80;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        proxy_pass http://django_app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /home/app/web/staticfiles/;
    }

    location /media/ {
        alias /home/app/web/mediafiles/;
    }

}

Здесь мы настраиваем наш сервер для прослушивания порта 80 и пересылки полученных запросов на порт 8000.

Затем создайте новый Dockerfile для веб-сервера.

$ touch Dockerfile

Вставьте следующие команды:

# Fetching the latest nginx image
FROM nginx:1.23-alpine

# Removing default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

# Copying our nginx.conf
COPY nginx.conf /etc/nginx/conf.d

Шаг 3: Настройка docker-compose

Теперь мы собираемся использовать плагин docker-compose для поддержки контейнера docker. Compose — это метод определения и выполнения многоконтейнерных приложений Docker. Чтобы установить docker-compose, выполните следующие команды.

$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}

$ mkdir -p $DOCKER_CONFIG/cli-plugins

$ curl -SL https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose

Изменить права доступа к файлам для текущего пользователя.

$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

Проверьте установку, выполнив проверку версии

$ docker compose version

Наконец, создайте файл docker-compose.yml в корне приложения.

$ touch docker-compose.yml

Вставьте следующие команды в файл.

докер-compose.yml

version: "3.9"
# Defining the compose version
services:

 # Nginx server
 nginx:
 
   # Build context
   build: ./nginx
   
   # Mapping machine and container ports
   ports:
     - 1337:80
     
   # Storage volumes
   volumes:
     - static_volume:/home/app/web/static
     - media_volume:/home/app/web/mediafiles
   depends_on:
     - web
   restart: "on-failure"
   
 # Django application
 web:
 
   # Build context
   build: ./web
   
   # Build commands
   command: sh -c "python manage.py makemigrations &&
                   python manage.py migrate &&
                   python manage.py collectstatic &&
                   gunicorn web.wsgi:application --bind 0.0.0.0:8000"
                   
   # Storage volumes
   volumes:
     - static_volume:/home/app/web/staticfiles
     - media_volume:/home/app/web/mediafiles
     
   # Exposing port 8000
   expose: 
   - 8000
   restart: "on-failure"
volumes:
 postgres_data:
 static_volume:
 media_volume:

Структура проекта: Вот как должна выглядеть структура проекта на данный момент:

Создайте докер-контейнеры для проекта, запустив

$ docker compose build

Запустите приложение, запустив контейнеры.

$ docker compose up

Откройте браузер и перейдите по адресу http://localhost:1337/, чтобы просмотреть домашнюю страницу приложения.