Как докеризировать приложение django для производственного развертывания с помощью Gunicorn и Nginx
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
| fromdjango.http importHttpResponsedefindex(request):    returnHttpResponse("Dockerizing Django Application") | 
Создайте файл urls.py в каталоге API и сопоставьте baseurl с нашим вновь созданным маршрутом.
urls.py
Python3
| fromdjango.urls importpathfrom. importviewsurlpatterns =[    path("", views.index, name="index"),] | 
Наконец, включите вновь созданный файл URL в основное приложение.
управлять.py
Python3
| fromdjango.contrib importadminfromdjango.urls importinclude, pathurlpatterns =[    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/, чтобы просмотреть домашнюю страницу приложения.