Gunicorn
Вместо встроенного веб-сервера в Django, который подходит только для разработки, мы будем использовать веб-сервер Gunicorn. Он будет работать только как сервер приложений. Выдача статического контента будет возложена на веб-сервер Nginx, он же будет выступать в качестве обратного прокси для сервера приложений Gunicorn, что позволит снизить нагрузку на него.
Gunicorn, так же как и библиотеку для PostgreSQL, нужно добавить в файл зависимостей requerements.txt:
gunicorn==21.2.0
Что-бы было удобно использовать образ для локальной разработки и для продакшена, создадим второй файл с названием docker-compose.prod.yml. Он будет аналогичен предыдущему образу за исключением нескольких моментов:
version: '3.8'
services:
web:
# Берем Dockerfile из каталога app
build: app
# Запускаем сервер gunicorn
command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
# Открываем порт 8000 внутри и снаружи
ports:
- 8000:8000
# Файл содержащий переменные для контейнера
env_file:
- .env.prod
# Дожидаемся запуска контейнера db и memcached
depends_on:
- db
- memcached
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=book_django
- POSTGRES_PASSWORD=pass_book_django
- POSTGRES_DB=book_django
memcached:
image: memcached:1.6.21
ports:
- 11211:11211
volumes:
postgres_data:
В этом файле мы убрали строку, где пробрасывали содержимое папки app в контейнер так как это не понадобится.
Создадим файл .env.prod, в который поместим те-же переменные, как и в файле env.dev.
Подразумевается, что для локальной разработки и что для деплоя, вы используете разные значения этих переменных:
DEBUG = True
SECRET_KEY = 'django-insecure-xxxxxxxxxxxx'
DJANGO_ALLOWED_HOSTS = '127.0.0.1'
CSRF_TRUSTED_ORIGINS = 'http://127.0.0.1'
CACHES_BACKEND = 'django.core.cache.backends.memcached.PyMemcacheCache'
CACHES_LOCATION = 'memcached:11211'
INTERNAL_IPS = '127.0.0.1'
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=book_django
SQL_USER=book_django
SQL_PASSWORD=pass_book_django
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres
На данный момент структура созданных файлов и папок следующая:
Выполним остановку предыдущих контейнеров, удалим их:
docker-compose down -v
Выполним билд нового контейнера для деплоя:
docker-compose -f docker-compose.prod.yml up -d --build
Выполним миграции, при которых будет создана структура нашей базы данных book_django:
docker-compose exec web python manage.py migrate --noinput
Теперь проверим работу, откроем в браузере http://127.0.0.1:8000, мы видим что наш проект работает нормально и с сервером приложений Gunicorn: