Рубрики
Без рубрики

Развертывание EDMS Mayan с использованием Docker и MySQL

Развертывание EDMS Mayan с использованием Docker и MySQL

Автор оригинала: Roberto Rosario.

Упаковка и распространение Python все еще не идеальны. Упаковка и распространение проектов Django менее совершенны и немного болезненны. Существует довольно много препятствий, которые необходимо преодолеть, чтобы упаковать проекты Django для распространения. Если вам интересно, я провел несколько бесед на эту тему в PyCon Sei.

Итак, что же такое Докер? Это способ изолировать программу на уровне операционной системы. В отличие от виртуализации, где все аппаратное обеспечение, на котором выполняется программа, изолировано от главного компьютера с помощью эмуляции, в контейнерах только операционная система, на которой выполняется программа, изолирована от главного компьютера с помощью отдельного “контекста” – метода, позволяющего запускать операционную систему внутри операционной системы. Хотя технически это не одно и то же, конечный результат “чувствует” себя похожим на конечного пользователя, как если бы это была своего рода “легкая визуализация”. Оборудование, способное разместить 10 виртуальных машин, сможет разместить 100 или более контейнеров.

Помимо изоляции операционной системы, Docker (и контейнеры в целом) также работает как упаковочное решение. Это происходит потому, что вы храните свою программу и все требования, необходимые для ее повторного выполнения, на одном и том же носителе распространения, вплоть до операционной системы. Это означает, что упакованная программа Docker будет работать точно так же, независимо от операционной системы хоста. В этом смысле он предлагает многие из тех же преимуществ визуализации без накладных расходов на выполнение.

“Докеризация” проектов Django – это искусство. Официальных рекомендаций нет, и все сообщество до сих пор изучает, что работает, а что нет. Если вам интересно узнать больше о состоянии технологий и методов, используемых для упаковки проекта Django в виде образа Docker, вы можете посмотреть мою презентацию PyCon Sette на эту тему.

Надеюсь, из этого введения у вас будет лучшее представление о том, почему создание образа Docker для Mayan-хорошая идея. Вы получаете распространяемый образ, который сокращает шаги установки с нескольких десятков до двух, и в итоге получаете изолированный от вашей системы исполнительный блок, которым можно управлять по желанию.

Философия упаковки в Docker заключается в том, что каждый контейнер должен выполнять только одну (или наименее возможную) функцию. Это называется “разделение проблем” и предлагает множество преимуществ, таких как возможность масштабирования определенных частей развертывания Docker. Следуя этой философии, образ EDMS майя включает в себя абсолютный минимум для обеспечения работающего экземпляра. То есть образ EDMS Mayan содержит EDMS Mayan, веб-сервер (NGINX), брокер для перемещения сообщений для фоновых задач и хранения их результатов (Redis для обоих), а также менеджер процессов, который поддерживает все пыхтение после развертывания. Поскольку Python имеет встроенную поддержку SQLite, он используется по умолчанию. Эта настройка даст вам довольно приличное и хорошо работающее развертывание до нескольких десятков тысяч документов и нескольких одновременных пользователей. Если вы хотите выйти за рамки этого, то вам нужно масштабировать развертывание Mayan EDMS Docker, начиная с базы данных, отсюда и цель этого поста.

Чтобы получить установку Mayan EDMS Docker с использованием MySQL, мы запустим два контейнера: один для MySQL и один для Mayan. Обычно программы настраиваются с помощью конфигурационных файлов или файлов “ini”, но философия докеризованных программ заключается в настройке контейнеров с помощью переменных среды. Вот шаги, которые нужно выполнить.

Шаг 1

Контейнеры Docker изолированы по дизайну, что означает выполнение, доступ к файлам и изоляцию доступа к сети. Чтобы наши два контейнера Docker “разговаривали”, мы создаем сеть только для них. Для этого мы используем команду:

docker network create mayan -d bridge

Это создает сеть bridge , простой тип сети, используемый для подключения хостов без маршрутизации. Мы назовем нашу мостовую сеть майя . Мы развернем наши контейнеры с помощью этой сети так, чтобы они имели сетевой доступ друг к другу, как если бы они были единственными двумя компьютерами в локальной сети (LAN). Docker недавно добавил поддержку динамических доменных имен, что означает, что мы можем ссылаться на контейнеры по имени, а не только по IP-адресу.

Шаг 2

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

# MySQL container
MYSQL_ROOT_PASSWORD=mysql_root_password
MYSQL_PASSWORD=mayan_password
MYSQL_DATABASE=mayan_db
MYSQL_USER=mayan_user # Mayan container
MAYAN_DATABASE_DRIVER=django.db.backends.mysql
MAYAN_DATABASE_NAME=mayan_db
MAYAN_DATABASE_USER=mayan_user
MAYAN_DATABASE_PASSWORD=mayan_password
MAYAN_DATABASE_HOST=mayan-mysql
MAYAN_DATABASE_PORT=3306

Первый набор переменных настраивает контейнер MySQL на создание базы данных при ее запуске, создание пользователя и предоставление ему всех прав доступа к этой базе данных. Второй набор переменных настраивает контейнер Mayan на использование указанных учетных данных для доступа к контейнеру базы данных, который с точки зрения Mayan является просто еще одним хостом в сети, в данном случае хостом, который будет называться mayan-mysql . Начальная строка просто говорит Майя, какой драйвер базы данных Django использовать при доступе к базе данных.

Шаг 3

Теперь мы приступаем к созданию и запуску первого контейнера, контейнера MySQL, используя командную строку:

docker run -d --name mayan-mysql --restart=always --env-file envfile -v mayan_mysql:/var/lib/mysql --net=mayan mysql:latest

Это говорит Докеру создать и запустить контейнер с именем mayan-mysql , который будет перезапускаться каждый раз, когда он останавливается по какой-либо причине (зависает или перезапускается хост), который будет использовать файл envfile для настройки, будет хранить свои данные из каталога /var/lib/mysql в постоянном хранилище Docker (называемом volumes) по имени mayan_mysql , будет использовать сеть mayan и будет использовать последний официальный образ MySQL Docker.

Вы можете просмотреть файлы журнала контейнера, когда он инициализируется с помощью команды:

docker logs mayan-mysql

Шаг 4

Наконец мы запускаем контейнер майя с командой:

docker run -d --name mayan-edms --restart=always --env-file envfile -v mayan_data:/var/lib/mayan --net=mayan -p 80:80 mayanedms/mayanedms:2.6.4-3

Это говорит Докеру создать и запустить контейнер с именем mayan-edms , который будет перезапускаться каждый раз, когда он останавливается по какой-либо причине , который будет использовать файл envfile для настройки, будет хранить свои данные из каталога /var/lib/mayan в постоянном томе Докера с именем mayan_data , будет предоставлять свой внутренний порт 80 (HTTP) как порт 80 внешнему миру, будет использовать сеть mayan и использует версию 2.6.4-3 официального изображения докера EDMS Майя.

Осмотрите журналы контейнера с помощью:

docker logs mayan-edms

и вы должны увидеть контейнер, создающий базу данных и выполняющий всю необходимую инициализацию. Через несколько минут вы сможете перейти на localhost (или 127.0.0.1), на порт 80 на машине, на которой работают контейнеры, и использовать Mayan в обычном режиме. Поскольку контейнеры были запущены с параметром --restart=always , вам не нужно ничего делать, чтобы запустить их в следующий раз при загрузке хост-компьютера.

Сравните эти шаги с количеством шагов, необходимых для “голого металла” производственного развертывания Mayan EDMS (или любого проекта Django), и вы поймете, почему Docker становится таким успешным средством не только для запуска кода, но и для его распространения.

Подпишитесь на рассылку новостей , чтобы продолжить узнавать больше о СЭД майя.