Однако, есть один нюанс – я не специалист в 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
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
Если вы еще не знакомы с 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
Важно, что используя ключ -е мы передаем внутрь контейнера переменную 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
Когда клонирование закончилось, то можно приступить к подготовке работы Majordomo. В составе скачанных файлов есть три вещи, которые нам необходимо исправить "под себя":
- загрузить шаблон базы данных
- создать конфигурационный файл
- установить системные переменные
6. Готовимся к запуску контейнера с Majordomo.
6.1. Во-первых, нам необходимо создать новую пустую базу с именем db_terminal, которая в будущем будет хранить данные системы Majordomo. Для этого выполните три команды:
Подключитесь к базе данных на компьютере 192.168.1.1 при помощи клиента mysql с именем пользователя root:
Код: Выделить всё
sudo mysql -uroot -p -h192.168.1.1
Код: Выделить всё
create database db_terminal;
Код: Выделить всё
exit;
6.2. Во-вторых, необходимо загрузить в пустую базу данных db_terminal данные, скачанные из репозитория. Для этого перейдите в папку /md и загрузите содержимой базы данных db_terminal из файла db_terminal.sql:
Код: Выделить всё
cd /md
Код: Выделить всё
sudo mysql -uroot -p -h 192.168.1.1 db_terminal < db_terminal.sql
Поздравляю, вы успешно загрузили данные 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
Код: Выделить всё
sudo cat /etc/passwd | more
Так получилось, что у меня имелся пользователь 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 не закончилась. Я бы сказал - она только началась, так как мест для изменений и оптимизации огромное множество.