Начало работы с 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 удаляет контейнеры сразу после их остановки.