Развертывание Django приложения в Яндекс Облаке на Kubernetes и MDB
Как развернуть Django приложение в Яндекс Облаке на Kubernetes и Managed Database.
Django приложение
Для примера возьмем простое Django приложение. Создадим Virtualenv и активируем его. Для этого создадим новый проект и приложение в нем.
python3 -m venv venv
source venv/bin/activate
pip install django
django-admin startproject demo
По умолчанию Django использует SQLite базу данных. Для работы с PostgreSQL нам нужно установить драйвер для нее.
pip install psycopg2
Теперь настроим подключение к базе данных. Для этого откроем файл settings.py
и внесем следующие изменения.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ.get("DB_NAME"),
"USER": os.environ.get("DB_USER"),
"PASSWORD": os.environ.get("DB_PASSWORD"),
"HOST": os.environ.get("DB_HOST"),
"PORT": os.environ.get("DB_PORT" or 6432),
'OPTIONS': {
'sslmode': 'verify-full',
'sslrootcert': os.path.join(BASE_DIR, 'ca-certificate.crt'),
},
}
}
Теперь перейдем в директорию проекта и создадим Dockerfile для нашего приложения.
cd demo
touch Dockerfile
В Dockerfile пропишем следующее:
# pull official base image
FROM python:3.11.4-slim-buster
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src /app
WORKDIR /app
EXPOSE 8000
CMD ["gunicorn", "--bind", ":8000", "--workers", "3", "djangok8s.wsgi"]
Этот Dockerfile создаст образ на основе Ubuntu 22.04, установит необходимые пакеты и зависимости для работы Django
приложения, а также запустит Gunicorn для обработки запросов на 8000
порту.
Теперь выполним сборку образа и запустим контейнер.
docker build -t demo .
Флаг -t
задает название для образа. После сборки образа мы можем посмотреть список образов на нашей машине.
docker images
Вывод будет примерно таким:
REPOSITORY TAG IMAGE ID CREATED SIZE
demo latest 0e382e58571c 9 minutes ago 579MB
Локальная база данных
Для локальной базы данных мы будем использовать PostgreSQL. Её мы тоже запустим в контейнере.
version: '3.9'
services:
postgres:
image: postgres:14
ports:
- 5432:5432
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=somepassword
- POSTGRES_USER=djangouser
- POSTGRES_DB=djangodb
django:
build:
context: .
dockerfile: Dockerfile
ports:
- 8000:8000
depends_on:
- postgres
environment:
- DB_HOST=postgres
- DB_NAME=djangodb
- DB_USER=djangouser
- DB_PASSWORD=somepassword
В этом файле мы описали два сервиса: postgres
и django
. В сервисе postgres
мы указали образ, который мы будем
использовать, а также порт, на котором будет доступна база данных. В сервисе django
мы указали образ, который мы
создали ранее, а также зависимость от сервиса postgres
. Также мы указали переменные окружения, которые будут
использоваться в нашем приложении.
Создадим директорию для хранения данных базы данных.
mkdir postgres
Запуск контейнера
Теперь мы можем запустить наши сервисы.
docker-compose up
После запуска контейнеров мы можем зайти в контейнер с Django приложением и выполнить миграции.
docker exec -it demo-django-1 bash
В контейнере выполним миграции.
python3 manage.py makemigrations
python3 manage.py migrate
Теперь мы можем зайти на страницу http://localhost:8000
и увидеть стандартную страницу Django.
Отлично. Теперь пришло время подготовить облачную инфраструктуру.