Перейти к содержанию

Быстрый старт: Установка Django + Postgresql c помощью Docker Compose

В этом кратком руководстве показано, как использовать Docker Compose для настройки и запуска простого приложения. Перед запуском , установите Docker Compose.

Определите компоненты проекта

Для этого проекта вам необходимо создать Dockerfile, файл зависимостей Python и файл docker-compose.yml . (Вы можете использовать расширение .yml или .yaml для этого файла.)

  1. Создайте пустой каталог проекта.

    Вы можете назвать каталог как-нибудь легко запомнить. Этот каталог является контекстом для вашего образа приложения. Каталог должен содержать только ресурсы для создания этого образа.

  2. Создайте новый файл с именем Dockerfile в каталоге вашего проекта.

    Dockerfile определяет содержимое образа приложения с помощью одной или нескольких команд сборки, которые настраивают этот образ. После сборки вы можете запустить образ в контейнере. Дополнительные сведения Dockerfileсм. в руководстве пользователя Docker и справочнике по файлу Docker.

  3. Добавьте следующее содержимое в файл Dockerfile.

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

Этот Dockerfile начинается с родительского образа Python 3 . Родительский образ изменяется путем добавления нового codeкаталога. Родительский образ дополнительно модифицируется путем установки требований Python, определенных в файле requirements.txt.

  1. Сохраните и закройте Dockerfile.

  2. Создайте файл requirements.txt в каталоге вашего проекта.

    Этот файл запускается командой RUN pip install -r requirements.txt в вашем Dockerfile.

  3. Добавьте необходимое пакеты в файл.

    Django==4.2.3
    psycopg2>=2.8
    
  4. Сохраните и закройте файл requirements.txt .

  5. Создайте файл с именем docker-compose.yml в каталоге вашего проекта.

    Файл docker-compose.yml описывает сервисы, которые делают ваше приложение. В этом примере этими службами являются веб-сервер и база данных. Файл компоновки также описывает, какие образы Docker используют эти сервисы, как они связываются друг с другом, какие тома им может потребоваться смонтировать внутри контейнеров. Наконец, docker-compose.yml файл описывает, какие порты предоставляют эти службы. Смотрите ссылку docker-compose.yml для получения дополнительной информации о том, как работает этот файл.

  6. Добавьте следующую конфигурацию в файл docker-compose.yml.

   services:
       db:
         image: postgres:14
         container_name: db
         restart: always
         volumes:
           - pgdata:/var/lib/postgresql/data
         environment:
           - POSTGRES_DB=postgres
           - POSTGRES_USER=postgres
           - POSTGRES_PASSWORD=postgres
         ports:
           - "5432:5432"
         networks:
           - djangonetwork
       webdjango:
         build: .
         container_name: django
         command: python manage.py runserver 0.0.0.0:8000
         volumes:
           - .:/code
         ports:
           - "8000:8000"
         environment:
           - POSTGRES_NAME=postgres
           - POSTGRES_USER=postgres
           - POSTGRES_PASSWORD=postgres
         depends_on:
           - db
         links:
           - db:db
         networks:
           - djangonetwork
   networks:
       djangonetwork:
         driver: bridge
   volumes:
     pgdata:

Этот файл определяет две службы: db и webdjango.

Примечание:

Это использует встроенный сервер разработки для запуска вашего приложения на порту 8000. Не используйте это в производственной среде. Для получения дополнительной информации см. Django документацию.

  1. Сохраните и закройте файл docker-compose.yml.

Создайте проект Django

На этом шаге вы создаете начальный проект Django, собирая образ из контекста сборки, определенного в предыдущей процедуре.

  1. Перейдите в корень каталога вашего проекта.

  2. Создайте проект Django, запустив команду docker compose run следующим образом.

sudo docker compose run web django-admin startproject myproject .

Это указывает Compose на запуск django-admin startproject myproject в контейнере с использованием webdjango образа и конфигурации службы. Поскольку webdjango образ еще не существует, Compose создает его из текущего каталога, как указано в строке build: . в файле docker-compose.yml.

После webdjango создания образа службы Compose запускает его и выполняет django-admin startproject команду в контейнере. Эта команда указывает Django создать набор файлов и каталогов, представляющих проект Django.

  1. После завершения команды docker compose перечислите содержимое вашего проекта.
ls -l
drwxr-xr-x 2 root   root   myproject
-rw-rw-r-- 1 user   user   docker-compose.yml
-rw-rw-r-- 1 user   user   Dockerfile
-rwxr-xr-x 1 root   root   manage.py
-rw-rw-r-- 1 user   user   requirements.txt

Если вы используете Docker в Linux, django-admin созданные файлы принадлежат пользователю root. Это происходит потому, что контейнер работает от имени пользователя root. Измените владельца новых файлов.

sudo chown -R $USER:$USER myproject manage.py

Если вы используете Docker на Mac или Windows, вы уже должны владеть всеми файлами, в том числе сгенерированными django-admin. Перечислите файлы, чтобы убедиться в этом.

ls -l
total 32
-rw-r--r--  1 user  staff  145 Feb 13 23:00 Dockerfile
drwxr-xr-x  6 user  staff  204 Feb 13 23:07 myproject
-rw-r--r--  1 user  staff  159 Feb 13 23:02 docker-compose.yml
-rwxr-xr-x  1 user  staff  257 Feb 13 23:07 manage.py
-rw-r--r--  1 user  staff   16 Feb 13 23:01 requirements.txt

Подключить базу данных

В этом разделе вы настроите подключение к базе данных для Django.

  1. В каталоге вашего проекта отредактируйте файл myproject/settings.py.

  2. Замените DATABASES = ... на следующее:

# settings.py

import os

[...]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('POSTGRES_NAME'),
        'USER': os.environ.get('POSTGRES_USER'),
        'PASSWORD': os.environ.get('POSTGRES_PASSWORD'),
        'HOST': 'db',
        'PORT': 5432,
    }
}

Эти параметры определяются образом postgres Docker, указанным в файле docker-compose.yml.

  1. Сохраните и закройте файл.

  2. Запустите команду docker compose up из каталога верхнего уровня для вашего проекта.

docker compose up
djangosample_db_1 is up-to-date
Creating djangosample_web_1 ...
Creating djangosample_web_1 ... done
Attaching to djangosample_db_1, djangosample_web_1
db_1   | The files belonging to this database system will be owned by user "postgres".
db_1   | This user must also own the server process.
db_1   |
db_1   | The database cluster will be initialized with locale "en_US.utf8".
db_1   | The default database encoding has accordingly been set to "UTF8".
db_1   | The default text search configuration will be set to "english".

<...>

webdjango_1  | July 30, 2020 - 18:35:38
webdjango_1  | Django version 3.0.8, using settings 'myproject.settings'
webdjango_1  | Starting development server at http://0.0.0.0:8000/
webdjango_1  | Quit the server with CONTROL-C.

На этом этапе ваше приложение Django должно работать на порту 8000 вашего хоста Docker. В Docker Desktop для Mac и Docker Desktop для Windows перейдите http://localhost:8000 в веб-браузере, чтобы увидеть страницу приветствия Django.

Django example

Примечание:

На некоторых платформах (Windows 10) вам может потребоваться отредактировать ALLOWED_HOSTS содержимое settings.py и добавить в список имя хоста Docker или IP-адрес. В демонстрационных целях вы можете установить значение:

ALLOWED_HOSTS = ['*']

Это значение небезопасно для производственного использования. Обратитесь к документации Django для получения дополнительной информации.

  1. Список запущенных контейнеров.

В другом окне терминала перечислите запущенные процессы Docker с помощью команды docker ps или docker container ls.

docker ps
CONTAINER ID  IMAGE       COMMAND                  CREATED         STATUS        PORTS                    NAMES
def85eff5f51  django_webdjango  "python3 manage.py..."   10 minutes ago  Up 9 minutes  0.0.0.0:8000->8000/tcp   django_webdjango_1
678ce61c79cc  postgres    "docker-entrypoint..."   20 minutes ago  Up 9 minutes  5432/tcp                 django_db_1
  1. Отключите службы и выполните очистку одним из следующих способов:

    • Stop the application by typing Остановите приложение, набравCtrl-C в той же оболочке, где вы его запустили:
    Gracefully stopping... (press Ctrl+C again to force)
    Killing django_webdjango_1 ... done
    Killing django_db_1 ... done
    
    • Или, для более элегантного завершения работы, переключитесь на другую оболочку и запустите docker compose down из верхнего уровня каталога вашего примера проекта Django.
    docker compose down
    
    Stopping django_web_1 ... done
    Stopping django_db_1 ... done
    Removing django_web_1 ... done
    Removing django_web_run_1 ... done
    Removing django_db_1 ... done
    Removing network django_default
    

После закрытия приложения вы можете безопасно удалить каталог проекта Django (например, rm -rf django).

Дополнительная документация по теме Docker Compose