Установка Majordomo в контейнеры Docker

Проблемы/вопросы, связанные с запуском под различными платформами и конфигурациями.

Модератор: immortal

Аватара пользователя
vpnki
Сообщения: 41
Зарегистрирован: Пн окт 10, 2016 11:49 pm
Благодарил (а): 9 раз
Поблагодарили: 16 раз
Контактная информация:

Установка Majordomo в контейнеры Docker

Сообщение vpnki » Пн дек 18, 2017 3:45 pm

Ох, зачем-то я решил запустить Majordomo в Docker.
Однако, есть один нюанс – я не специалист в Majordomo и поэтому не могу оценить того, что получилось.
Работает оно или нет – мне не вполне понятно, поэтому прошу помощи у сообщества.
Понимая, что тема контейнеров Docker не для массового потребителя и допускаю, что многие с ней не знакомы, поэтому и моя инструкция не вполне инструкция, а какое-то повествование с лирическими отступлениями.


Итак,
В моем примере, в качестве операционной системы компьютера используется Ubuntu 16.04 LTS и сюда мы будем ставить Majordomo.

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

Ядро линукс будет при этом единым как для операционной системы компьютера, так и для всех контейнеров. Это базовое отличие контейнеров от привычных нам виртуальных машин.
Тем не менее, внутри контейнера может функционировать другая линукс-подобная операционная система - например, Debian, Alpine и другие, которые схожи с базовой ОС компьютера.
Таким образом, операционная система внутри контейнера умело пользуется возможностями материнской операционной системы.

Важная особенность заключается в том, что внутри контейнера функционирует один процесс. Говоря простыми словами, чтобы запустить одно приложение вам нужен один контейнер. Хотите запустить два приложения – запускайте два контейнера.
Это так скажем, best practice, однако существуют методы и способы запуска нескольких процессов и приложений внутри контейнера при помощи различных менеджеров приложений, которые берут на себя полномочия по разделению процессов внутри контейнера.
Мы не будем останавливаться на этих технологиях, хотя кое-какие менеджеры работают внутри используемых в нашем примере контейнеров. На них я обращу ваше внимание отдельно.



1. Установка Docker.
Считаем, что вам удалось установить и запустить у себя систему Docker СЕ (community edition), которая инсталлируется для Ubuntu так, как описано в этом гайде.
https://docs.docker.com/engine/installa ... ce/ubuntu/
Допустим, что Docker у вас уже появился.



2. Сколько контейнеров?
Согласно базовой парадигме Docker "одно приложение - один контейнер", для запуска Majordomo в контейнерах Docker нам потребуются три контейнера.

Первый контейнер это веб-сервер на базе Apache и операционной системы Alpine
Второй это база данных MySQL и операционная система Apline
Третий контйнер это, собственно, сама система Majordomo на базе того же Alpine

Почему Alpine? Потому что в ней есть все что нужно и при этом она крайне мала с точки зрения занимаемого места… всего какие-то килобайты.

В рамках установки я не создавал собственные образы Apache и MySQL, а пользовался уже готовыми образами с hub.docker.com
А вот контейнер с Majordomo мне пришлось создать.

Итак, начнем с подготовки системы.
Допустим, что адрес нашего компьютера 192.168.1.1

Создайте директорию /md - в ней будет находиться корень нашего веб-сервера, а также там будут располагаться все файлы системы Majordomo

Код: Выделить всё

sudo mkdir /md
Мы создали папку, владельцем которой является root. Пока просто запомните это - нам это еще пригодится.




3. Запускаем веб-сервер.
Справедливости ради стоит отметить, что этот образ не просто образ Apache, а Apache + PHP7, ведь для работы Majordomo нам потребуется умение веб-сервера работать с PHP7
Как ни странно, в этом образе работает один из упомянутых ранее менеджеров приложений (supervisord), который разделяет процессы Apache и PHP между собой, представляясь материнской операционной системе единым процессом.
Запустим контейнер:

Код: Выделить всё

sudo docker run -d --name majordomo-webserver -p 80:80 -p 443:443 -p 8001:8001 -v /md:/app webdevops/php-apache:alpine
Чуть-чуть поясню. Запускаем с ключом -d (detached), считайте в режиме демона с именем majordomo-webserver, выставляя наружу порты 80, 443, 8001 и делая маппинг между папкой /md в материнской ОС и папкой /app внутри контейнера.
Если вы еще не знакомы с Docker, то вы увидите, как система скачивает образ webdevops/php-apache:alpine, состоящий из многих слоев.
Все в порядке. Вместе эти слои сформируют ваш образ, который затем можно использовать для многократного запуска контейнеров, давая каждому из них свои имена, параметры и прочее.

Убедитесь, что контейнер работает путем выполнения команды

Код: Выделить всё

sudo docker ps
Надеюсь, что вы нашли свой контейнер в списке работающих контейнеров.

Запускаем браузер на своем компьютере и проверяем
http://192.168.1.1

Так как наша папка /md пуста, то мы видим следующий текст

Index of /
Apache/2.4.27 (Unix) Server at 192.168.1.1 Port 80

Это хорошо, значит контейнер с Apache успешно работает.





4. Запускаем MySQL
Теперь займемся MySQL и это чуть будет посложнее, чем Apache

4.1. Сначала создадим папку /md-database в материнской ОС, в которой будут располагаться файлы базы данных.

Код: Выделить всё

sudo mkdir /md-database

4.2. Запускаем контейнер MySQL такой командой:

Код: Выделить всё

sudo docker run -d --name majordomo-database -p 3306:3306 -v /md-database:/app -e MYSQL_ROOT_PASSWORD=majordomo wangxian/alpine-mysql
И снова поясню. Запускаем с ключом -d (так же как и Apache) и именем majordomo-database, выставляя наружу порт 3306 и делая маппинг между папкой /md-database в материнской ОС и /app внутри контейнера.
Важно, что используя ключ -е мы передаем внутрь контейнера переменную MYSQL_ROOT_PASSWORD, которая затем станет паролем для пользователя root при работе с базой данных.
В нашем примере в базе будет создан пользователь root с паролем majordomo

Проверьте, что контейнер успешно запущен путем выполнения команды sudo docker ps
Ну и на всякий случай загляните в папку /md-database, там должна появиться поддиректория mysql





5. Качаем Majordomo
Cкачиваем саму систему Majordomo и располагаем ее в директории /md
Для этого выполняем команду:

Код: Выделить всё

sudo git clone https://github.com/sergejey/majordomo.git /md       
Этой командой мы копируем все, что есть в репозитории Sergejey на гитхабе в директорию /md

Когда клонирование закончилось, то можно приступить к подготовке работы Majordomo. В составе скачанных файлов есть три вещи, которые нам необходимо исправить "под себя":
- загрузить шаблон базы данных
- создать конфигурационный файл
- установить системные переменные




6. Готовимся к запуску контейнера с Majordomo.

6.1. Во-первых, нам необходимо создать новую пустую базу с именем db_terminal, которая в будущем будет хранить данные системы Majordomo. Для этого выполните три команды:

Подключитесь к базе данных на компьютере 192.168.1.1 при помощи клиента mysql с именем пользователя root:

Код: Выделить всё

sudo mysql -uroot -p -h192.168.1.1
, а при запросе пароля укажите пароль majordomo

Код: Выделить всё

create database db_terminal; 
- создаем базу данных db_terminal - выходим из сессии с базой данных

6.2. Во-вторых, необходимо загрузить в пустую базу данных db_terminal данные, скачанные из репозитория. Для этого перейдите в папку /md и загрузите содержимой базы данных db_terminal из файла db_terminal.sql:

Код: Выделить всё

sudo mysql -uroot -p -h 192.168.1.1 db_terminal < db_terminal.sql
после запроса пароля введите пароль majordomo для пользователя root в базе данных
Поздравляю, вы успешно загрузили данные Majordomo в базу данных!

6.3. Конфигурационный файл системы majordomo также имеется в составе скаченного из репозитория, просто его необходимо переименовать (скопировать) и поменять в нем кое-что.

Код: Выделить всё

sudo cp /md/config.php.sample /md/config.php

6.3. Теперь мы имеем файл /md/config.php в котором нам необходимо поменять некоторые строки. Для этого выполните

Код: Выделить всё

sudo nano /md/config.php
и поменяйте строки так, чтобы получилось следующее:

Define('DB_HOST', '192.168.1.1');
Define('DB_NAME', 'db_terminal');
Define('DB_USER', 'root');
Define('DB_PASSWORD', 'majordomo')
Сохраните Ctrl+X

Все эти стоки отвечают за подключение системы Majordomo к базе данных. Думаю, что все вполне понятно - адрес 192.168.1.1, база db_terminal, пользователь root, пароль majordomo

6.4. Ну и напоследок, в составе загруженных файлов есть файл под названием /md/cycle.php который, собственно, является основным циклом системы Majordomo.
Нам необходимо сделать его запускаемым. Для этого выполните

Код: Выделить всё

sudo chmod +x /md/cycle.php




7. Запускаем контейнер с Majordomo
Контейнер подготовлен и лежит на hub.docker.com в репозитории margadongit/majordomo
Для его скачивания и запуска воспользуйтесь приведенной ниже командой, но в качестве переменной SERVER_NAME укажите адрес своего компьютера с Majordomo.
В моем случае это был адрес 192.168.1.1

Код: Выделить всё

sudo docker run -d --name majordomo -e SERVER_NAME="192.168.1.1" -v /md:/md margadongit/majordomo




8. Немного проверяем
Что же, осталось проверить как все работает, хотя запуск трех контейнеров это еще не конец :)
Зайдите браузером на http://192.168.1.1 и вы должны увидеть привычный интерфейс Majordomo (или инсталляционную страницу с выбором языка и временной зоны).
Ура! Но не совсем…





9. Туманная часть :)
Напоследок я оставил самую "туманную часть" системы Docker это работа с правами пользователей.
Как было сказано выше, контейнер Docker это "гроздь процессов", выполняемых единым Linux kernel вашей хостовой машины.
Проблема заключается в том, что исполняемые в контейнере процессы должны принадлежать какому-то пользователю на материнской машине.
Для этого исполняемый контейнер имеет возможности быть запущенным с разными правами.
Несмотря на то, что вы, делая команду sudo docker run стартуете контейнер от пользователя рут, все, что происходит внутри контейнера не должно иметь отношения к руту хостовой машины.
Ведь, иначе все контейнеры и их внутренние задачи будут запускаться от истинного рута и о каком разделении ресурсов может идти речь?
Иными словами, внутри контейнера все процессы должны запускаться каким-то другим пользователем, который, однако, должен быть и на хосте.
На практике, некоторые контейнеры позволяют, запуская себя, в качестве переменных принимать значения UID и GID, с которыми их процессы будут видны материнской машине.
Так, например, процессы, запущенные нами ранее в контейнере с веб-сервером Apache на самом деле работают от имени пользователя с UID=1000 и группой с GID=1000.
Вопрос в том, а есть ли такой пользователь на вашей машине и определены ли для него права?

Это можно проверить выполнив команды

Код: Выделить всё

sudo cat /etc/group | more
- посмотреть группы пользователей и их GID

Код: Выделить всё

sudo cat /etc/passwd | more
- посмотреть пользователей и их UID

Так получилось, что у меня имелся пользователь serge c UID=1000 и группа serge с GID=1000
Это означает, что мой контейнер с веб-сервером для системы Majordomo функционирует от имени пользователя serge. Однако, как вы помните, когда мы создавали директорию /md мы создали ее от имени рута и поэтому контейнер с веб-сервером не сможет ничего записать в эту директорию, хотя прочитать, конечно, сможет.
На практике, это означает, что интерфейс Majordomo будет работать, но вот установить новые плагины вы не сможете.
Чтобы исправить это я выполнил команду, изменяющую владельца папки /md и всех ее файлов на пользователя serge и группу serge

Код: Выделить всё

sudo chown -R 1000:1000 /md
После этого контейнер с веб-сервером смог успешно сохранять данные.

Но и это еще не все.
Дело в том, что инструкция по установке Majordomo на Ubuntu предполагает изменение нескольких параметров PHP, которые я пока не менял.
Это, несомненно, можно сделать, но для меня сейчас важнее, чтобы кто-то, кто знаком с Majordomo прошел эту инструкцию до конца и смог сказать – оно работает или нет? :)
И на что я потратил эти бессонные ночи ...

PS: На этом адаптация Majordomo к контейнерам Docker не закончилась. Я бы сказал - она только началась, так как мест для изменений и оптимизации огромное множество.
За это сообщение автора vpnki поблагодарили (всего 5):
directman66 (Пн дек 18, 2017 6:56 pm) • evilviva (Вт янв 23, 2018 11:27 am) • Anton (Пн июн 11, 2018 10:14 pm) • ndie (Ср май 08, 2019 8:58 am) • Saparow (Ср авг 07, 2019 1:18 pm)
Рейтинг: 5.81%
Chainik
Сообщения: 1462
Зарегистрирован: Вс янв 10, 2016 11:05 am
Благодарил (а): 260 раз
Поблагодарили: 454 раза

Re: Установка Majordomo в контейнеры Docker

Сообщение Chainik » Пн дек 18, 2017 5:06 pm

Прошу прощения, что задаю "отвлеченный" вопрос, но как любили спрашивать преподаватели советской политэкономии у выдвигающих рацпредложения студентов, "а какую пользу это принесет народному хозяйству"? Другими словами, можете объяснить чайнику, вроде меня, зачем в принципе имеет смысл устанавливать MDM в контейнер? Чтобы эффективно использовать MDM на внешних серверах?
Просто у обычного пользователя Мажордомо своя локальная MDM в единственном экземпляре и, как правило, даже не на виртуальной машине.
Последний раз редактировалось Chainik Пн дек 18, 2017 5:30 pm, всего редактировалось 1 раз.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение skysilver » Пн дек 18, 2017 5:14 pm

Chainik, можно например на NAS таким образом поставить.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
vpnki
Сообщения: 41
Зарегистрирован: Пн окт 10, 2016 11:49 pm
Благодарил (а): 9 раз
Поблагодарили: 16 раз
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение vpnki » Пн дек 18, 2017 6:29 pm

Chainik писал(а):Другими словами, можете объяснить чайнику, вроде меня, зачем в принципе имеет смысл устанавливать MDM в контейнер?
Да, правильный вопрос. Ставить Мажордомо в контейнеры для обычного пользователя не имеет никакого явного смысла.
Однако, я нашел аргументы "за" лично для себя (но я и не обычный пользователь).

1. Наличие разных сущностей сначала усложняет, а потом упрощает их эксплуатацию, замену, апгрейд и прочее.
Можно прибить контейнер с апачем и запустить на его месте nginx (правда будут сложности). Можно все это запустить не на Alpine, а на Debian.
Можно перенести контейнер с одного компьютера на другой (или вот на NAS или на модем). Можно поделиться контейнером с другом. Одно и то же можно тестировать на разных ОС просто запуская и убивая контейнеры. В итоге, поддержка и развитие системы станут проще.

2. Можно запустить несколько инстансов всего этого хабара (правда зачем, если вы не предоставляете услуги? это, скорее, актуально для нас). Один себе, второй для жены, третий для ребенка :) Ну или много персональных мажордомов на коттеджный поселок..

3. Контейнеризация заставляет по-другому взглянуть на написание некогда единого софта. Взаимодействие компонентов становится более понятным, структурным и безопасным, а новые модули и приложения могут стать не просто модулем к системе, а таким же самостоятельным контейнером, который развивается не только для Мажордомо, но и как самостоятельный компонент. Сегодня пишешь для Мажоромо, а работать будет и с ним и Openhub или кем там еще... (это совсем, конечно, фантазия).

4. Для домашней автоматизации уже кое-что написано в контейнерой эко-системе. Почему бы этим не пользоваться для интеграции?

Ну то есть в принципе, явных преимуществ для конечного пользователя нет, но если смотреть на перспективу развития и интеграции, то плюсы имеются.

Правда они, скорее всего, для разработчиков, но они, в итоге, станут плюсами и для пользователей. (надеюсь)
За это сообщение автора vpnki поблагодарили (всего 2):
directman66 (Пн дек 18, 2017 6:58 pm) • Chainik (Пн дек 18, 2017 7:15 pm)
Рейтинг: 2.33%
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение directman66 » Пн дек 18, 2017 6:59 pm

В идеале, чтобы система была единым контейнером и устанавливалась плагином. Как например плагины для openmediavault, freeNAS и подобных систем. Это намного упрощает развертывание и установку продуктов. Я еще пытался найти вариант загрузки системы по сети! Какие-то наработки у людей есть, но не более того. Даже тему тут поднимал. Вообще мне кажется можно собрать БД, вэбсерер и MD в один контейнер.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
vpnki
Сообщения: 41
Зарегистрирован: Пн окт 10, 2016 11:49 pm
Благодарил (а): 9 раз
Поблагодарили: 16 раз
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение vpnki » Пн дек 18, 2017 7:11 pm

directman66 писал(а):В идеале, чтобы система была единым контейнером и устанавливалась плагином. Как например плагины для openmediavault, freeNAS и подобных систем. Это намного упрощает развертывание и установку продуктов. Я еще пытался найти вариант загрузки системы по сети! Какие-то наработки у людей есть, но не более того. Даже тему тут поднимал. Вообще мне кажется можно собрать БД, вэбсерер и MD в один контейнер.
Несомненно, собрать в один контейнер можно и это следующий шаг. Просто пока я следовал базовой парадигме докера - одно приложение - один контейнер :)

И еще, двигаться дальше я не могу, пока кто-нибудь не протестирует это на предмет работы того, что получилось.
Скорее всего, функционал Мажордомо не заработает и я знаю почему, но нужно в этом убедиться.
evilviva
Сообщения: 39
Зарегистрирован: Пт июл 28, 2017 9:54 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Установка Majordomo в контейнеры Docker

Сообщение evilviva » Вт янв 23, 2018 11:26 am

отличная работа! попытаюсь выкроить на выходных время и потестить.
с точки зрения активных экспериментов по настройке системы "под себя" очень полезная вещь, поскольку можно одновременно иметь все варианты конфигов, не заморачиваясь отдельными бэкапами (это для тех, кто спрашивает-наперкуа?)
Спасибо.
evilviva
Сообщения: 39
Зарегистрирован: Пт июл 28, 2017 9:54 pm
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Установка Majordomo в контейнеры Docker

Сообщение evilviva » Вт янв 23, 2018 5:54 pm

один вопрос
Ubuntu 16.04 LTS в какой "редакции" 32/64, desk/srv?
Аватара пользователя
vpnki
Сообщения: 41
Зарегистрирован: Пн окт 10, 2016 11:49 pm
Благодарил (а): 9 раз
Поблагодарили: 16 раз
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение vpnki » Ср янв 24, 2018 1:36 am

Убунта была серверная, 64
Аватара пользователя
vpnki
Сообщения: 41
Зарегистрирован: Пн окт 10, 2016 11:49 pm
Благодарил (а): 9 раз
Поблагодарили: 16 раз
Контактная информация:

Re: Установка Majordomo в контейнеры Docker

Сообщение vpnki » Ср янв 24, 2018 1:38 am

Спасибо за отзыв! Буду рад если найдете время пройти этот путь
Ответить