Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

11.6 Docker Compose на примере Django, PostgreSQL и Memcached
3 из 7 шагов пройдено
0 из 14 баллов  получено

Теперь, когда вы знаете о том, для чего мы собираемся использовать Docker Compose, пришло время создать ваше первое клиент-серверное приложение с использованием этого инструмента.

В этом разделе разберемся с тем, что такое Docker Compose и как он работает на реальном небольшом проекте — положим Django и PostgreSQL в контейнеры, так чтобы они работали как одно целое. Для сборки кластера контейнеров используется docker-compose.yml.

Docker-compose.yml — конфигурационный файл в YAML-формате, описывающий логику запуска и взаимодействия контейнеров между собой и внешним миром. В сущности инструкции заложенные в docker-compose.yml по логике работы идентичны ключам команды docker run.


Для запуска контейнеров через docker-compose используются следующие команды:

  • docker-compose build: собрать проект
  • docker-compose up -d: запустить проект
  • docker-compose down: остановить проект
  • docker-compose logs -f [service name]: посмотреть логи сервиса
  • docker-compose ps: вывести список контейнеров
  • docker-compose exec [service name] [command]: выполнить команду в контейнере
  • docker-compose images: вывести список образов


Подготовка проекта к Docker Compose

Первым делом нам необходимо удалить команды из Dockerfile которые открывают доступ к порту и выполняют команды запуска:

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]


Далее вынесем некоторые настройки в отдельный файл. Как мы можем прочитать из документации, в основном, что делает python-dotenv, это считывает пары ключ-значение из файла .env и устанавливает их как переменные среды для последующего извлечения. Мы уже использовали его в курсе "Django 4 для начинающих".

Для этого необходимо обновить список зависимостей requirements.txt, добавив туда следующую строку:

python-dotenv==1.0.0


И отредактировать файл настроек settings.py, добавить в самое начала файла следующий код:

from dotenv import load_dotenv
import os
load_dotenv()


Далее изменим нужные переменные:

SECRET_KEY = str(os.getenv('SECRET_KEY'))

DEBUG = str(os.getenv('DEBUG'))

ALLOWED_HOSTS = str(os.getenv('DJANGO_ALLOWED_HOSTS')).split(" ")

CACHES = {
    'default': {
        'BACKEND': str(os.getenv('CACHES_BACKEND')),
        'LOCATION': str(os.getenv('CACHES_LOCATION')),
    }
}

INTERNAL_IPS = str(os.getenv('INTERNAL_IPS')).split(" ")


И добавим данную строку:

CSRF_TRUSTED_ORIGINS = str(os.getenv('CSRF_TRUSTED_ORIGINS')).split(" ")


Теперь изменим расположение нашего проекта. Для этого в корне создадим папку app, и переместим в неё проект вместе с Dockerfile.


А в файл .env добавим следующий код:

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.locmem.LocMemCache'
CACHES_LOCATION = 'unique-snowflake'
INTERNAL_IPS = '127.0.0.1'

Настройки в файле .env говорят, что сервер будет запускаться в режиме отладки и принимать подключения с 127.0.0.1.


Теперь, каждый раз выполняя сборку контейнеров, у нас будут выполняться следующий процесс:

  1. При запуске контейнера будет читаться файл .env содержащий какие-то значения;
  2. Значения из файла будут помещены как глобальные переменные проекта (переменные окружения);
  3. Django, через библиотеку os.getenv, читает некоторые переменные из окружения и подставляет где нужно.

Таким образом, если мы захотим поменять настройки, нам не придется еще раз редактировать settings.py или docker-compose.yml.


Затем добавьте файл docker-compose.yml в корень проекта:

version: '3.8'

services:
  web:
    # Берем Dockerfile из каталога app
    build: ./app
    # Запускаем тестовый сервер
    command: python manage.py runserver 0.0.0.0:8000
    # куда будут помещены данные из каталога app
    volumes:
      - ./app/:/usr/src/app/
    # Открываем порт 8000 внутри и снаружи
    ports:
      - 8000:8000
    # Файл содержащий переменные для контейнера
    env_file:
      - ./.env

Обратите внимание на значение version. Если вы используете старую версию Docker - вам может потребоваться ее изменить.

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

Внутри папки app находится наш Django проект, его Dockerfile и requirements.txt.


Проверим файл settings.py, а именно папку наших шаблонов, при перемещении проекта PyCharm автоматически меняет путь:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']

STATICFILES_DIRS = [BASE_DIR / 'static']


Создадим файл .dockerignore в корне нашего проекта, чтобы исключить лишние папки и файлы:

venv
.idea


Перед выполнением следующих шагов проверьте в Docker Desktop запущенные контейнеры, их необходимо остановить. Теперь попробуем создать наш образ Docker Compose:

docker-compose build


После создания образа запустите контейнер:

docker-compose up -d

Опция -d или --detach используется для создания и запуска контейнеров в фоновом режиме.


Перейдите на http://127.0.0.1:8000, чтобы убедиться что наш Django проект работает:


Теперь мы можем открыть Docker Desktop и посмотреть на наши контейнеры:


В следующем шаге мы добавим сервис PostgreSQL к нашему проекту.


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

SECRET_KEY = 'django-insecure-xxxxxxxxxxxx' а ключ мы берем каждый свой в настройках?

@Ilia_Boiarintsev, да, ключ надо использовать свой.

А у меня почему то вот такая проблема:

@Ilia_Boiarintsev, PS igmore я исправил, но requirements найти это не помогло)

@Ilia_Boiarintsev, а он есть в директории app? Если нет, то можно отсюда взять https://github.com/Permin0ff/htmx_books_docker/blob/master/app/requirements.txt

Или создать командой

pip freeze > requirements.txt

@Дмитрий_Селезнев, на картинке же видно его наличие

@Ilia_Boiarintsev, а в докер файле какая команда на копирование этого файла?

COPY requirements.txt /usr/src/app

Такая?

@Ilia_Boiarintsev, я проглядел))

@Дмитрий_Селезнев, нет, 

COPY app/requirements.txt /usr/src/app

@Ilia_Boiarintsev, исправьте.

@Дмитрий_Селезнев, спасибо!

я не понимаю что вы хотели сказать этим смс, так как изменений ноль! джанго все так же ищет файлы там где и искал раньше но только наш проект теперь в папке апп!
 

Проверим файл settings.py, а именно папку наших шаблонов, при перемещении проекта PyCharm автоматически меняет путь:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']

STATICFILES_DIRS = [BASE_DIR / 'static']

@No_Name, Если в PyCharm Professional Edition переместить папку с проектом, то в settings.py автоматически будет изменен путь.

вот тут не понятно!

моя версия докера Docker version 20.10.22   


3.8 это версия питона???


Затем добавьте файл docker-compose.yml в корень проекта:

version: '3.8'

services:
  web:
    # Берем Dockerfile из каталога app
    build: ./app
    # Запускаем тестовый сервер
    command: python manage.py runserver 0.0.0.0:8000
    # куда будут помещены данные из каталога app
    volumes:
      - ./app/:/usr/src/app/
    # Открываем порт 8000 внутри и снаружи
    ports:
      - 8000:8000
    # Файл содержащий переменные для контейнера
    env_file:
      - ./.env

Обратите внимание на значение version. Если вы используете старую версию Docker - вам может потребоваться ее изменить.

@No_Name, это версия спецификации compose.

https://docs.docker.com/compose/compose-file/compose-versioning/

 

 

Почему то не загружается...

@Григорий_Кожанов, загрузите проект по ссылке https://mega.nz/filerequest/rANtUqzWHQ4.

@Дмитрий_Селезнев, Загрузил

@Григорий_Кожанов, Смотрите, видимо PyCharm при перемещении проекта, автоматически добавил app к приложению blog. 

И была ошибка - ModuleNotFoundError: No module named 'app'

urls.py - path('', include('app.books.urls')),

settings.py - INSTALLED_APPS = [ 'app.books', ]

apps.py - name = 'app.books'

Также в настройках уберите из путей статики и шаблонов папку app

Изменен Илья Перминов

@Илья_Перминов, Да, упустил этот момент. Спасибо, заработал:)