Развертывание приложений Django в автономном режиме с помощью Docker-compose

Docker
Развертывание приложений Django в автономном режиме с помощью Docker-compose

Нам нужно развернуть CMS-подобное приложение в нашей интранет-среде, которая представляет собой CRUD некоторых форм, экспорта данных, управления правами персонала и других функций. Думая, что Django очень хорошо справляется с этой работой, а объем разработки невелик, поэтому я выбрал Django в качестве основы для разработки. Функция разработки относительно проста, и для достижения вышеуказанных функций почти используются плагины, такие как xadmin. Но есть проблема, которую мы не можем обойти, то есть развертывание в среде интрасети, такие инструменты, как pip, нельзя использовать в интрасети, но, к счастью, в интрасети доступен сервер yum, поэтому мы решили использовать интрасеть Установите Docker на сервер, а затем скопируйте контейнер из среды разработки в производственную среду для развертывания. Вот основные шаги:

  1. Установите Docker-ce для среды разработки
  2. Установите Docker-compose для среды разработки
  3. Настроить среду разработки
  4. сохранить контейнер
  5. Установите Docker-ce и docker-compose для производства
  6. Отправьте файл контейнера и запустите

Уведомление: Моя среда разработки здесь — Ubuntu18.04, а производственная среда — Centos7.2. Если вы находитесь в другой среде, проверьте разницу самостоятельно и используйте команду, подходящую для вашей системы.

Установите Docker-ce для среды разработки

Docker и Docker-compose — это то, что нам нужно продемонстрировать в этом развёртывании Я постараюсь уменьшить прикладную часть Django. Docker отвечает за базовую часть виртуализации контейнеров. Docker-compose — это инструмент оркестрации контейнеров. С ним нам не нужно писать оболочки для реализации соединения между контейнерами. Давайте сначала установим Docker-ce, здесь в основном имеется в виду Dockerофициальная документация, если то, что я написал, недостаточно подробно или устарело, вы можете обратиться к официалам для просмотра более авторитетных и обновленных документов.

удалить старую версию

Перед установкой необходимо удалить старую версию Docker.Если у вас новая система, вы можете пропустить этот шаг.

$ sudo apt remove docker docker-engine docker.io containerd runc

подходящий репозиторий для установки

  1. Обновить индекс пакета apt
$ sudo apt update
  1. Разрешить доступ к репозиторию через https
$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
  1. Добавлен официальный GPG-ключ Docker.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Добавить репозиторий Docker
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Установить Docker-ce

После завершения вышеуказанных приготовлений установить Docker-ce несложно.Если вы знакомы с Ubuntu, вы сможете установить его в ближайшее время.

$ sudo apt update
$ sudo apt install -y docker-ce

После установки запустите службу Docker и включите ее запуск при каждой загрузке системы.

$ sudo systemctl start docker
$ sudo systemctl enable docker

Установите Docker-compose для среды разработки

После установки Docker-ce с Docker-compose легко работать. Если вы напрямую загружаете скомпилированный двоичный файл Docker-compose на Linux и других платформах, вы можете его использовать.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

После завершения загрузки измените разрешения и добавьте исполняемый файл.

$ sudo chmod +x /usr/local/bin/docker-compose

Наконец, вы можете проверить номер версии Docker-compose, чтобы убедиться, что установка прошла успешно.

$ docker-compose --version
docker-compose version 1.24.0-rc1, build 0f3d4dda

Настроить среду разработки

Средой разработки здесь является среда Django.Для демонстрационного проекта я стараюсь использовать только что созданный проект Django для удобства демонстрации.

Создайте новый проект Django.

Чтобы создать новый проект Django, сначала создайте папку верхнего уровня, чтобы поместить файлы проекта в эту папку. Структура каталогов примерно следующая:

--project
  --Dockerfile
  --docker-compose.yml
  --mysite
    --manage.py
    --requirements.txt

Сначала создайте папку проекта

$ mkdir project

Затем создайте новый проект Django или скопируйте существующий проект.

$ django-admin.py startproject mysite

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

На предыдущем шаге уже есть проект Django под названием mysite.Предположим, мы поместили в эту папку требования.txt, и содержимое примерно такое:

$ cat requirements.txt
defusedxml==0.5.0
diff-match-patch==20181111
Django==2.1.7
django-crispy-forms==1.7.2
django-formtools==2.1
django-import-export==1.2.0
django-reversion==3.0.3
et-xmlfile==1.0.1
future==0.15.2
httplib2==0.9.2
jdcal==1.4
odfpy==1.4.0
openpyxl==2.6.0
pytz==2018.9
PyYAML==3.13
six==1.10.0
tablib==0.12.1
unicodecsv==0.14.1
xadmin==0.6.1
xlrd==1.2.0
xlwt==1.3.0
mysqlclient==1.4.2

Конечно, это зависимость, необходимая для моего проекта, ваша зависимость может отличаться от моей.

Новый докерфайл

Следующим шагом с проектом и файлами зависимостей проекта является создание образа Docker рабочей среды нашего проекта Django.Сначала создайте Dockerfile для создания образа Docker. Создайте новый Dockerfile в папке проекта со следующим содержимым:

$ cat Dockerfile
FROM python:3.6.8
ENV PYTHONUNBUFFERED 1

RUN mkdir /config
ADD /mysite/requirements.txt /config/
RUN pip install -r /config/requirements.txt
RUN mkdir /src
WORKDIR /src/mysite

Я кратко объясняю этот файл

FROM python:3.6.8

Базовый образ, который я здесь использую, — это python: 3.6.8, а его базовый образ — Ubuntu, с которой я знаком.Если вы знакомы с alpine, вы также можете использовать alpine, который намного меньше.

ENV PYTHONUNBUFFERED 1

Вы можете использовать ключевое слово Env для создания произвольных переменных среды операционной системы.

ENV PYTHONUNBUFFERED 1

Например, если вы использовали его для хранения ключей Django, вы могли бы написать:

ENV DJANGO_SECRET_KEY l!fafmjcqyn+j+zz1@2@wt$o8w8k(_dhgub%41l#k3zi2m-b%m

Используйте это в своем коде:

import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

RUNКак следует из названия, RUN предназначен для запуска команд в контейнере Здесь команда RUN создает две папки /config и /src, а также среду зависимостей для установки Python.

RUN mkdir /config
RUN mkdir /src
RUN pip install -r /config/requirements.txt

ADD

ADD /mysite/requirements.txt /config/

Добавить локальные файлы в контейнерWORKDIR

WORKDIR /src/mysite

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

Новый скрипт для создания докеров

Docker-compose можно использовать для управления несколькими контейнерами.В прошлом добавление вручную большого количества параметров для запуска контейнеров и подключения контейнеров можно было выполнить с помощью docker-compose. Мой контент docker-compose.yml примерно такой:

$ cat docker-compose.yml
version: '3'
services:
    db:
      image: mysql:5.7
      container_name: mysite_db
      ports:
        - "3306:3306"
      environment:
        MYSQL_ROOT_PASSWORD: mysite
        MYSQL_DATABASE: mysite
        LANG: C.UTF-8
      command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
    web:
      build: .
      container_name: mysite_web
      command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
      depends_on:
        - db
      volumes:
        - ./mysite:/src
      restart: always
      ports:
        - "8002:8000"

Давайте кратко объясним этот файл docker-compose.

version: '3'

Относится к версии docker-compose, и элементы конфигурации, поддерживаемые разными версиями, немного отличаются.servicesУправляемые сервисы, в нашем случае два сервиса: db и web. Позвольте мне объяснить элементы конфигурации в двух службах отдельно. дБ:

образ напрямую использует концентратор докеров или локальный существующий образ, для этого используется MySQL5.7 container_name указывает имя контейнера ports указывает сопоставление портов контейнера с хостом, передний — это порт хоста, а последний — порт контейнера. Среда определяет среду, в которой работает текущая служба.Подробнее о среде см. в описании текущего образа.Мы можем указать, какие из них поддерживаются выше. В этом случае мы указали пароль root MySQL, базу данных по умолчанию и набор символов базы данных. command Команда после запуска контейнера, сюда добавляются параметры дефолтной кодировки mysql веб: build компилирует образ, вот Dockerfile в текущей папке команда Команда, которая будет выполнена после запуска контейнера depend_on Служба, от которой зависит текущий контейнер, то есть служба в зависимости должна успешно запустить текущую службу, прежде чем ее можно будет запустить. volumes Тома, которые будут смонтированы текущим контейнером.Передняя часть относится к каталогу хоста, за которым следует каталог контейнера. перезапуск указывает стратегию перезапуска контейнера. Текущий случай — перезапускать все время, если есть ошибка. Здесь порт 8000 контейнера сопоставляется с портом 8002 хоста, а доступ к веб-сервису осуществляется через порт 8002.

Настройте проект Django.

Теперь измените файл settings.py проекта mysite для текущей среды контейнера.

$ vim mysite/mysite/settings.py

Найдите в файле раздел ALLOW_HOSTS и добавьте в него «web» со следующим содержимым:

ALLOW_HOSTS = [
    ...
    'web'
]

Затем измените раздел DATABASES в settings.py и измените параметры на параметры базы данных службы MySQL.Содержимое примерно следующее:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'USER': 'root',
        'PASSWORD': 'mysite',
        'HOST': 'db'
    }
}

Здесь все параметры подключения MySQL определены в среде в разделе db файла docker-compose.yml. Стоит отметить, что значение параметра HOST равно db. После того, как docker-compose запустит контейнер, эти контейнеры будут подключены. "Здесь можно напрямую заполнить "db"".

Соберите проект с помощью Docker-compose

После вышеуказанных усилий мы в основном готовы, мы можем создать наш образ, здесь есть две службы, db нужно только загрузить или использовать локальный образ при запуске, и сеть также должна быть построена с использованием Dockerfile.

$ docker-compose build

Через некоторое время загрузки или сборки вы можете увидеть информацию о том, что образ был успешно собран.

Запустите проект и протестируйте его

После завершения сборки есть образ веб-службы, и теперь мы используем docker-compose для запуска службы.

$ docker-compose up -d

Этот процесс также может занять некоторое время, в зависимости от скорости вашего интернета, он загрузит образ MySQL, создаст контейнер на основе db и веб-образов и запустит контейнер. После завершения вы можете использовать docker-compose ps и образы docker-compose для просмотра созданных нами контейнеров и образов.

$ docker-compose ps
Name                 Command               State                 Ports              
---------------------------------------------------------------------------------------
mysite_db    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
mysite_web   bash -c python manage.py m ...   Up      0.0.0.0:8002->8000/tcp           
$ docker-compose images
Container    Repository    Tag       Image Id      Size
--------------------------------------------------------
mysite_db    mysql        5.7      e47e309f72c8   355 MB
mysite_web   mysite_web   latest   3989acbcc3c9   938 MB

Вы также можете использовать команду docker-compose для остановки и запуска служб. Другие более конкретные методы использования см. в официальной документации.

$ docker-compose start
Starting db  ... done
Starting web ... done
$ docker-compose stop
Stopping mysite_web ... done
Stopping mysite_db  ... done

Вы можете видеть, что порядок, в котором службы останавливаются и запускаются, является регулярным.Когда служба запускается, сначала запускается зависимая служба, а затем запускает службу, которая зависит от нее.Когда служба оценена, все наоборот. После того, как служба запустится нормально, вы можете посетить браузер, чтобы проверить, нормально ли запускается служба.

сохранить контейнер

Если с сервисом все работает нормально, нам нужно сохранить текущий контейнер для подготовки к развертыванию на новой платформе.Уведомление: Здесь нам нужно использовать save для сохранения образа. Использование save включает в себя такую ​​информацию, как состояние соединения между контейнерами. Если вы используете export для экспорта образа в производственную среду, вы не можете использовать docker-compose для восстановления службы.

$ docker save -o mysql.tar mysql:5.7
$ docker save -o mysite.tar mysite_web:latest

Когда приведенная выше команда будет успешно выполнена, в текущем каталоге будут созданы два файла tar вместе с файлами Dockerfile и docker-compose.yml в каталоге проекта, и они будут готовы к переносу на рабочий компьютер.

Установите Docker-ce и docker-compose для производства

Поскольку производственной средой является CentOS, ее можно установить напрямую с помощью yum.

$ sudo yum install docker-ce

После успешной установки обратитесь к среде разработки, чтобы развернуть docker-compose на рабочем сервере.

Отправьте файл контейнера и запустите

Используйте scp или другие инструменты для отправки mysql.tar, mysite.tar, Docker-compose.yml и папки проекта на рабочий сервер и найдите подходящую папку для хранения этих файлов, сохранив исходную структуру каталогов. Давайте сначала восстановим два образа на рабочий сервер.

$ docker load -i mysql.tar
$ docker load -i mysite_web.tar

Подождав некоторое время для завершения выполнения, вы можете увидеть, что на текущем сервере уже есть эти два зеркала.

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysite_web          latest              3989acbcc3c9        2 days ago          983MB
mysql               5.7                 e47e309f72c8        3 weeks ago         372MB

Перед выполнением контейнера сборки нам также нужно внести простую модификацию в docker-compose.yml. Вы также заметили, что на рабочем сервере нет Интернета, поэтому зеркало больше нельзя построить, и мы также скопировали зеркало среды разработки, поэтому на этот раз веб-сервис изменен для запуска с зеркала, а содержимое примерно так:

version: '3'
services:
    db:
      ...
    web:
      image: mysite_web:latest
      ...

Просто измените элемент сборки в Интернете, удалите его и добавьте элемент изображения, а содержимое — это изображение, которое мы скопировали. Позже мы можем собрать контейнер и запустить службу.

$ docker-compose up -d

результат

Name                  Command               State                 Ports              
----------------------------------------------------------------------------------------
mysite_web   bash -c python manage.py m ...   Up      0.0.0.0:8002->8000/tcp           
mysite_db     docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp

Откройте браузер еще раз, чтобы проверить, нормально ли он запускается.

постскриптум

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

Справочная документация