DevGang
Авторизоваться

Начало работы с Docker и Django

В этом руководстве вы узнаете, как настроить Django приложение и среду разработки  с помощью Docker.

Примечание. Предыдущая версия этого руководства была написана до появления Docker для Mac. Я недавно обновил руководство, используя Docker 17.06.

1. Установите Docker для Mac

Начнем с того, что установим Docker для Mac или Docker для Windows.

2. Знакомимся с Docker

Откройте shell (используя приложение типа Terminal или iTerm) и выполните следующую команду:

docker run -it ubuntu:16.04 bash

Команда docker run позволяет запустить контейнер из образа. В этом случае вы создаете контейнер из образа ubuntu:16.04. Это образ Ubuntu с тегом 16.04.

Каждый контейнер Dockerа должен запускать отдельный процесс. Таким образом, команда docker run позволяет вам указать одну команду для запуска внутри контейнера. В нашем случае мы собираемся запустить оболочку bash. Итак, мы указали, что нужно запустить под bash. Так как мы запускаем оболочку bash, нам нужно выделить псевдо-TTY и оставить STDIN открытым. Вот почему мы добавили параметры -it к команде run.

После выполнения этой команды вы должны увидеть что-то вроде этого:

root@69129699ac86:/#

Это оболочка bash, запущенная внутри контейнера, который вы только что создали из образа Ubuntu. Вы можете запустить ps, чтобы увидеть, какие процессы выполняются в этом контейнере.

root@69129699ac86:/# ps
 PID TTY          TIME CMD
   1 ?        00:00:00 bash
  18 ?        00:00:00 ps

Введите команду exit, чтобы закрыть оболочку. Теперь вы можете запустить Docker PS, чтобы увидеть, какие контейнеры работают в настоящее время. Вы должны обнаружить, что нет работающих контейнеров. Но если вы запустите команду docker ps -a, вы увидите все контейнеры, включая тот, который вы только что остановили. Поскольку контейнеры предназначены для запуска одного процесса, по завершении этого процесса контейнер останавливается.

Взгляните на поля, отображаемые docker ps -a. Это два важных поля - CONTAINER ID  и NAMES. Если вы хотите взаимодействовать с вашими контейнерами, вам нужно знать имя или идентификатор.

Если вы хотите снова запустить этот контейнер, вы можете сделать это с помощью команды docker start -ai. Поскольку COMMAND , связанная с этим контейнером, - это bash, нам нужно присоединить STDIN, STDOUT и STDERR, следуя опции -ai.

Теоретически мы можем запустить наш контейнер в фоновом режиме. Если бы наша команда была чем-то другим, например, python manage.py runserver 0.0.0.0:8000, мы бы, вероятно, захотели запустить наш контейнер в фоновом режиме. В этом случае мы сможем увидеть, как работает наш контейнер, когда мы введем docker ps. Если мы хотим запустить команду в существующем контейнере, мы будем использовать команду docker exec. Команда exec предоставляет уже знакомые нам опции, поэтому, если мы хотим открыть оболочку в нашем django контейнере, необходимо набрать docker exec -itbash.

3. Создайте свой Dockerfile

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

Для этой демонстрации вы можете создать каталог для хранения всех ваших файлов. Я создал каталог с именем ~ /repos/django-docker. Вы можете сделать это так:

mkdir -p ~/repos/django-docker

и перейти в эту директорию

cd ~/repos/django-docker

Теперь создайте файл в этом каталоге с именем Dockerfile.

touch Dockerfile

Затем отредактируйте этот файл. Добавьте следующее в Dockerfile:

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

Прочитайте Dockerfile reference, чтобы узнать о том как создать Dockerfilе немного больше.

4. Создайте файл requirements.txt.

Файл requirements.txt содержит модули python, необходимые для запуска вашего приложения. В этом случае, когда нужно установить Django и psycopg2 (postgres + python), Dockerfile, который мы создали на предыдущем шаге, установит эти необходимые модули.

touch requirements.txt

Откройте этот файл для редактирования. Добавьте следующее:

Django
psycopg2

 

5. Создайте свой файл docker-compose.yml

 

touch docker-compose.yml

Откройте этот файл для редактирования. Добавьте следующее:

version: '3.3'services:
 db:
   image: postgres
 web:
   build: .
   command: python manage.py runserver 0.0.0.0:8000
   volumes:
     - .:/code
   ports:
     - "8000:8000"
   depends_on:
     - db

Читайте также compose file reference  для подробного ознакомления.

6. Создайте свой Django проект 

Вам нужно будет использовать команду docker-compose run для запуска Django проекта . Конечно, если у вас уже запущен проект, этот шаг не нужен, но все же все равно будет полезным все вспомнить.

В вашем файле docker-compose.yml мы указали команду, которую хотим запустить как python manage.py runserver 0.0.0.0:8000. Это команда будет запущена, когда мы вызовем наш контейнер с помощью docker-compose. Но прежде чем мы доберемся до этой точки, нам на самом деле нужен Django проект. Для этого нам нужно запустить команду для нашего веб-сервиса, используя docker-compose run.

docker-compose run web django-admin.py startproject composeexample .

7. Настройте Django для подключения к базе данных

Настройки базы данных Django находятся в файле settings.py, расположенном в каталоге вашего основного приложения - composeexample/settings.py. Откройте этот файл для редактирования.

Найдите файл DATABASES и убедитесь, что конфигурация выглядит следующим образом:

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'postgres',
       'USER': 'postgres',
       'HOST': 'db',
       'PORT': 5432,
   }
}

Обратите внимание на имя хоста. Если вы посмотрите на свой файл docker-compose, это имя службы базы данных, которую мы создаем. Когда мы используем docker compose для запуска наших сервисов, сеть создается по умолчанию, и наши контейнеры могут связываться друг с другом в этой сети. Более того, они могут связаться друг с другом, используя имя хоста, идентичное имени сервиса.

8. Запустим docker-compose up

На данный момент мы готовы запустить наше пустое приложение. Запустите docker-compose, чтобы запустить сервер Django.

docker-compose up

Вы сможете просмотреть свой сайт в браузере, используя http://localhost:8000.

9. Запустим тесты

Запуск тестов производится довольно просто. Вы можете запустить базовый тест с помощью команды docker-compose run.

docker-compose run web python manage.py test

Но что, если вы хотите автоматизировать тесты? Недавно я вдохновился идеей автоматизировать тестирование в deploy script. Поэтому, когда я его запускаю, я сначала запускаю контейнер докера, затем запускаю тесты, и если тесты пройдут, я могу продолжить развертывание. В противном случае останавливливаюсь и исправляю проблемы.

Я создал простой тестовый скрипт:

#!/bin/bashpython manage.py test --noinput 2> /var/log/test.log 1> /dev/nullif [ $? -ne 0 ]; then
   cat /var/log/test.log
   exit 1
fi

И затем в сценарии развертывания я добавил следующее:

docker-compose run --rm web ./bin/test.shif [ $? -ne 0 ]; then
       echo "Tests did not pass! Fix it."
       exit 1
fi

Флаг --rm удаляет контейнеры сразу после их остановки.

#Python #Django
Комментарии 1
Anri 02.03.2020 в 21:01

у меня не обновляется конфигурация в settings.py , остается sqlite3, а не postgresql

Чтобы оставить комментарий, необходимо авторизоваться