Запуск IBM Domino в Docker контейнере

В прошлой статье я рассказал, что начал знакомиться с docker-ом. У меня в продакшене уже используется несколько контейнеров (например GitLab и swagger editor).  А теперь, не просто из спортивного интереса, я заинтересовался,  можно ли засунуть в контейнер сервер IBM Domino. У меня на работе есть несколько Notes разработчиков, которые для работы используют dev инстанс Domino сервера, но проблема в том, что этот инстанс работает на обычном компьютере. Компьютер достаточно мощный, но тем не менее, хотелось бы перенести этот инстанс на нормальный сервер, у которого и надежность выше и нет перебоев с питанием. Казалось бы, нет ничего проще, пишешь админам, чтобы подняли еще одну виртуалку и перенесли туда этот сервер. Но не все так просто в толстом и жирном энтерпрайзе:( Ресурсы, бюджеты, согласования — сплошная бюрократия, скучно и нудно.

Но не будем о грустном:) Итак есть задача — запустить IBM Domino в Docker контейнере. Естественно, первым делом спрашиваем Google. И о чудо  — добрые люди уже все сделали за нас. Спасибо Matteo Bisi и Daniele Vistalli они подготовили прекрасную презентацию о том, как запустить домино в докере. Поигравшись с ихними Dockerfile я решил их немного усовершенствовать. Основная претензия была связана с размером финального образа. Ниже на картинке красным выделен образ Domino 9.0.1 с установленным FP7, который я сделал на основе презентации Daniele. Оранжевым выделен образ после моих изменений и, наконец-то, синим показан образ, который я запущу в продакшен.

1_images

2.  Итак. Ниже показано дерево папок для создания имиджей

2_tree

  • domino901 — папка для установки сервера 9.0.1 без фикспаков
  • domino901_fp7 — папка для создания образа с фикспаком, на основе образа  с чистым сервером 9.0.1.
  • domino901fp7 — единый image доминмино 9.0.1 c FP7. Такой образ имеет самый маленький размер.
  • domino901_setup — содание образа под инстанс сервера
  • software — папка с дистирбутивом Domino 9.0.1  и FP7

Почему так много папок? В контейнейрной технологии важную роль играют слои. Я могу сделать образ с читым сервером, а потом на его основе делать образы под различные фикспаки, это очень удобно для тестов нового фикспака или, например, если у вас есть системы, которые должны работать на определнной версии.

3. Причина, по которой образ коллег получался большим, в том, что они использовали одельные команды COPY и RUN  для установки Domino:

COPY sw-repo/${dominopackagedir}/ /tmp/sw-repo/
RUN /bin/bash -c "/tmp/sw-repo/install -silent -options /tmp/sw-repo/unix_response.dat"
RUN rm /tmp/* -R

Вместо этого я решил сделать самые тяжеловестыне операции в одной команде RUN . Для этого я создал еще один контейнер с nginx который раздает статический контент из  папки software. Теперь при помощи wget  или  curl я могу загрузить пакеты домино в образ без команды COPY.

Запускаем контейнер nginx и проверяем закачку файлов. Кстати, это еще одно приимущество контейнеров. Я честно признаюсь, что до этого момента никогда не имел дела nginx. А тут так быстро и одной командой запустил контейнер с веб сервером, не заморачивался с его установкой и настройкой.

docker run --name software -p 7777:80 -v /home/vs/software:/usr/share/nginx/html:ro -d nginx

3_wget

Напомню, что ubuntu02.local — это адрес моей виртуальной машины, он прописан у меня в /etc/hosts  . Тест пройден, все работает, идем дальше.
4. Соберем образ Domino 9.0.1. В подпапке resources у меня находятся скрипты необходимы для запуска  domino (спасибо Daniel Nashed )  и файл ответов для silent установки domino.

Мой Dockerfile

FROM ubuntu:14.04

ENV DOM_SCR=resources/initscripts
ENV DOM_CONF=resources/serverconfig

RUN apt-get update && \
 apt-get install -y nano && \
 apt-get install -y wget && \
 apt-get clean

RUN useradd -ms /bin/bash notes && \
 usermod -aG notes notes && \
 usermod -d /local/notesdata notes && \
 sed -i '$d' /etc/security/limits.conf && \
 echo 'notes soft nofile 60000' >> /etc/security/limits.conf && \
 echo 'notes hard nofile 80000' >> /etc/security/limits.conf && \
 echo '# End of file' >> /etc/security/limits.conf

COPY ${DOM_CONF}/ /tmp/sw-repo/serverconfig

RUN mkdir -p /tmp/sw-repo/ && \
 cd /tmp/sw-repo/ && \
 wget -q http://ubuntu02.local:7777/DOMINO_9.0.1_64_BIT_LIN_XS_EN.tar && \
 tar -xf DOMINO_9.0.1_64_BIT_LIN_XS_EN.tar &&\
 /bin/bash -c "/tmp/sw-repo/linux64/domino/install -silent -options /tmp/sw-repo/serverconfig/domino901_response.dat" && \
 cd / && \
 rm /tmp/* -R

RUN mkdir -p /etc/sysconfig/
COPY ${DOM_SCR}/rc_domino /etc/init.d/
RUN chmod u+x /etc/init.d/rc_domino && \
 chown root.root /etc/init.d/rc_domino
COPY ${DOM_SCR}/rc_domino_script /opt/ibm/domino/
RUN chmod u+x /opt/ibm/domino/rc_domino_script && \
 chown notes.notes /opt/ibm/domino/rc_domino_script
COPY ${DOM_SCR}/rc_domino_config_notes /etc/sysconfig/

Как видите, закачка пакета, установка сервера и очистка временной директории сделана в одной команде RUN.  Таким образом мы сэкономили порядка 1 Gb

Строим образ:

docker build -t vs/domino:9.0.1 .

4_domino901

5. На моем компьютере обзраз собирался около 10 минут.

5_domino901_end
6. Таим же образом созадем образ  c седьмым фикспаком

FROM vs/domino:9.0.1

ENV DOM_CONF=resources/serverconfig

COPY ${DOM_CONF}/ /tmp/sw-repo/serverconfig

ENV NUI_NOTESDIR /opt/ibm/domino/

RUN mkdir -p /tmp/sw-repo/ && \
 cd /tmp/sw-repo/ && \
 wget -q http://ubuntu02.local:7777/domino901FP7_linux64_x86.tar && \
 tar -xf domino901FP7_linux64_x86.tar &&\
 cd /tmp/sw-repo/linux64/domino && \
 /bin/bash -c "./install -script /tmp/sw-repo/serverconfig/domino901_fp7_response.dat" && \
 cd / && \
 rm /tmp/* -R

Как видите, я его уже создаю на основе образа vs/domino:9.0.1 из предыдущего шага. Запускаем сборку.

docker build -t vs/domino:9.0.1-fp7 .

6_0

На картинке у меня сначала была ошибка, поэтому не обращайте внимание на первую команду, там был прописан неверный родительский образ в Dockerfile :)

7. Через 3-5 минут мы имеем готовый образ с Domino 9.0.1 FP7. Все отлично, кроме того, что размер образа оказался уж слишком большим. Все из-за того, что при установке FP делается бекап предыдущих данных. Теоретически можно удалить папку /opt/ibm/domino/notes/90010/linux/data1_bck  и сэкономить 244Mb, но я не стал этого делать. Этот образ у меня останется для тестов. Точно также можно сделать образ для FP5 или FP6.

6_1

8. Проверив фикспак, я решил объединить утсановку сервера и накатывание фикспака в один образ:

FROM ubuntu:14.04
#FROM vs/ubuntu:14.04

ENV DOM_SCR=resources/initscripts
ENV DOM_CONF=resources/serverconfig

#install nano & wget
RUN apt-get update && \
 apt-get install -y nano && \
 apt-get install -y wget && \
 apt-get clean

RUN useradd -ms /bin/bash notes && \
 usermod -aG notes notes && \
 usermod -d /local/notesdata notes && \
 sed -i '$d' /etc/security/limits.conf && \
 echo 'notes soft nofile 60000' >> /etc/security/limits.conf && \
 echo 'notes hard nofile 80000' >> /etc/security/limits.conf && \
 echo '# End of file' >> /etc/security/limits.conf

COPY ${DOM_CONF}/ /tmp/sw-repo/serverconfig
ENV NUI_NOTESDIR /opt/ibm/domino/

RUN mkdir -p /tmp/sw-repo/ && \
 cd /tmp/sw-repo/ && \
 wget -q http://ubuntu02.local:7777/DOMINO_9.0.1_64_BIT_LIN_XS_EN.tar && \
 tar -xf DOMINO_9.0.1_64_BIT_LIN_XS_EN.tar &&\
 /bin/bash -c "/tmp/sw-repo/linux64/domino/install -silent -options /tmp/sw-repo/serverconfig/domino901_response.dat" && \
 cd /tmp/sw-repo/ && \
 rm /tmp/sw-repo/linux64 -R && \
 wget -q http://ubuntu02.local:7777/domino901FP7_linux64_x86.tar && \
 tar -xf domino901FP7_linux64_x86.tar &&\
 cd /tmp/sw-repo/linux64/domino && \
 /bin/bash -c "./install -script /tmp/sw-repo/serverconfig/domino901_fp7_response.dat" && \
 cd / && \
 rm /tmp/* -R

RUN mkdir -p /etc/sysconfig/
COPY ${DOM_SCR}/rc_domino /etc/init.d/
RUN chmod u+x /etc/init.d/rc_domino && \
 chown root.root /etc/init.d/rc_domino
COPY ${DOM_SCR}/rc_domino_script /opt/ibm/domino/
RUN chmod u+x /opt/ibm/domino/rc_domino_script && \
 chown notes.notes /opt/ibm/domino/rc_domino_script
COPY ${DOM_SCR}/rc_domino_config_notes /etc/sysconfig/

Собираем образ:

docker build -t vs/domino:9.0.1fp7 .

7_0

9. Образ будет собираться 13-15 минут.

7_1

10. Вот три наших образа. С любого из них можно запустить сервер Домино.

8
11. Но мы создадим еще один образ, в котором откроем нужные порты и установим entry point.

Dockerfile:

FROM vs/domino:9.0.1fp7

EXPOSE 25 80 443 1352

COPY resources/docker-entrypoint.sh /
RUN chmod 775 /docker-entrypoint.sh

USER notes
WORKDIR /local/notesdata
ENV LOGNAME=notes
ENV PATH=$PATH:/opt/ibm/domino/

ENTRYPOINT ["/docker-entrypoint.sh"]

docker-entrypoint.sh

#!/bin/bash

serverID=/local/notesdata/server.id

if [ ! -f "$serverID" ]; then
 /opt/ibm/domino/bin/server -listen 1352
else
 /opt/ibm/domino/rc_domino_script start
 /bin/bash
fi

В зависимости от того, сущестувет в каталоге data  файл  server.id или нет, я запускаю удаленную настройку сервер или же просто запускаю сервер. Обратите внимание, что я запускаю листенер на порт 1352. Это сделано для того, чтобы не открывать в контейнере еще один порт 8585

Собираем image

docker build -t vs/domino_server:1.0 .

Я не сильно заморачивался с названиями имиджей:) Через пару секунд мы получили образ, с которого можно запустить контейнер

9_server

12. Перед тем, как запускать контейнер, необходимо созать volume, в котором у нас будет храниться /local/notesdata. Это персистант каталог, который будет храниться независимо от контейнера.

docker volume create --name=domino-sgn

Запускаем контейнер в интерактивном режиме:

docker run -it -p 8080:80 -p 1352:1352 -p 8443:443 -p 2525:25 --name domino_sgn -v domino-sgn:/local/notesdata vs/domino_server:1.0

Обратите внимание на маппинг портов, по этим портам будет доступен наш контейнер

11_start_container
13. Каталог /local/notesdata Даже при удалении контейнера эти данные останутся.

10_volume
14.  Получилась интересная матрешка, я работаю на macOS Sierra, в которой стоит виртульная машина с ubuntu 16.04, внутри которой запущен контейнер с ubuntu 14.04 и Domino 9.0.1

Запускаем еще одну виртуальную машину с  windows 7. В hosts  я добавил ip своего linux сервера ubuntu02.local.

Далее стандартная настройка сервера Domino

12_windows
15.

13_D1
16.

13_D2
17.

13_D3
18.

13_D4
19.

13_D5
20.

13_D6
21.

13_D7
22.

13_D8
23.

13_D9
24.

13_D10
25.

13_D11
26.

13_D12
27. Процесс настройки можно видеть в консоли. После завершения удаленной настройки листенер останавливается тем самым завершает работу контейнера.

13_D13
28. Смотрим список контейнеров:

14_status
29. Запускаем контейнер еще раз:

docker start domino_sgn

И подключаемся к контейнеру:

docker attach  domino_sgn

Как видите, мы вошли в контейнер под пользователем notes и наш рабочий каталог /local/notesdata

Можем запустить скрипт

rc_domino_script monitor

и посмотреть, что происходить в консоле Domino

15_domino_start
30. Сервер работает

16_domino_process
31. Попробуем открыть почту в веб браузере и отправить письмо:

17_iNotes
32. Выйдем из консоли Domino и посмотрим список процессов в контейнере:

18_top
33. Ну и наконец остановим сервер

rc_domino_script  stop

19_stop

По-моему, все получилось, если не считать надписи  SERVER CRASHED ON SHUTDOWN :)

P.S. Вот ссылка на все мои скрипты: https://github.com/sharavara/domino901_docker