こんにちは。
intra-martの環境構築ってすごく面倒くさいですよね。
TL;DR
resin-proとimart.warさえ準備すれば、1時間かかってた環境構築作業が15分で終わって、
いい感じにDockerコンテナ上でintra-martが動くので、検証作業が楽になって幸せ。
目次
intra-mart(イントラマート)とは
「そもそもintra-martって何?」という感じかもしれません。
intra-martはNTTデータイントラマート社が提供する、企業向けのシステム共通基盤です。
個別最適化された企業内のIT環境を一つに集約し、業務アプリケーションの全社横断的な運用を可能にするシステム共通基盤(開発・運用フレームワーク)です
「システム共通基盤/PaaS | NTTデータイントラマート」ページ説明より引用
稟議や手続きなどの承認フローの作成機能や、Webブラウザ上でのドラッグ&ドロップによる画面開発機能、
その他グループウェア、コラボレーション等の機能が提供されています。
勤め先でこの基盤が導入されている方であればご存知かもしれません。
企業競争力を強化する製品・サービス群 | システム共通基盤の株式会社NTTデータイントラマート
環境構築時の課題
僕は、現在勤めている会社でintra-martを利用して、アプリ開発・保守や技術検証等を実施しています。
つまり新機能の検証なども実施するため・・・
例えばアップデートによって追加された新機能をちょっと試したいけど、既存の環境は汚したくないという場合には
セットアップ直後のまっさらの状態の環境が必要になります。
しかしintra-martは環境構築作業だけでかなりの時間がとられてしまうのです。
環境構築作業一覧
下記に、環境構築時に実施する必要のある作業を一覧化してみましたが・・・多すぎる
- JDKのインストール
- resin-proのセットアップ
- intra-martのダウンロードライブラリから、resin-pro-x.x.x.tar.gzをダウンロードし展開
- プロパティの設定
- Redhat EnterpriseやCentOSのインストール
- resinのmakeに必要なパッケージ・ライブラリのインストール
- make実行
- Jugglingプロジェクトの作成、warファイル出力
- データベースのセットアップ
- インストーラのダウンロード
- ミドルウェアのインストール
- データベース作成
- スキーマ、ユーザ作成
- 権限付与
- warファイルのデプロイ
- intra-martのテナント環境セットアップ
慣れていれば1時間もかからず作業を終えてしまえるのですが、そうでない場合は3時間程度はかかってしまうこともあります。
そしてとにかく、ダウンロードやインストール、セットアップ等々、手動で何度も繰り返し実施するのは非常に面倒です。
改善方法の検討→環境構築を部分的に自動化
とにかく、手動作業が多すぎて嫌になりました。
そこで今回は最近学習を始めたDockerを利用して、自動かつ爆速(誇張表現?)でintra-mart環境を構築できるようにしてみました。
Dockerプロジェクトの配置先(Githubリポジトリ)
Githubにアップしました。
github.com
Dockerでやること
- JDKのインストール
- resin-proのセットアップ
- CentOSのインストール
- resinのmakeに必要なパッケージ・ライブラリのインストール
- make実行
- データベースのセットアップ
- インストーラのダウンロード
- ミドルウェアのインストール
- データベース作成
- スキーマ、ユーザ作成
- 権限付与
手動でやること
- resin-proのセットアップ
- intra-martのダウンロードライブラリから、resin-pro-x.x.x.tar.gzをダウンロードし展開
- プロパティの設定
- Jugglingプロジェクトの作成、warファイル出力
- warファイルのデプロイ
- intra-martのテナント環境セットアップ
Dockerで作成するintra-martのシステム構成
Docker上の環境
ホスト名 | コンテナイメージ | 目的 |
---|
ap | CentOS 7.5.1804(※1)(library/centos) | resin-proの実行及びwarデプロイ |
db | PostgreSQL 10(library/postgres) | intra-martに関するデータの保存 |
adminer | Adminer(library/adminer) | dbのデータ参照用のアプリ |
(※1 厳密には、NTTデータイントラマート社はintra-martが動作するLinux環境として、Red Hat Enterprise Linux 6.x、7.xのみを動作保証しているため、
本Docker関連ファイルを利用する場合は、あくまでも動作検証用の環境に留めておくことをおすすめします。本記事の内容によって発生した障害等について、一切責任を負いません)
必要なPC環境
OS | バージョン | Docker |
---|
Windows7以降 | 64bit | Docker Toolbox |
Windows10 | 64bit | Docker for Windows |
macOS | - | Docker for Mac |
なお、試してはいませんがVT-xを有効にする等の対応によって
32bit環境でもDockerが利用できるようなので、32bit環境でも実行できるかもしれませんね。
(僕は32bitのPCは持っていないので、試せていません)
利用手順
ここからは、本Dockerプロジェクトを利用して、intra-martの環境を構築する手順を記述いたします。
(この手順は、Windows10 + Docker Toolboxを前提にしています。必要に応じて適宜読み替えをお願いします。)
[2] Dockerのメモリを増やす
- Dockerで利用するメモリを確保するため、VirtualBoxから、メモリを増やしておきます。
下記のURLの記事にメモリを増やす方法が詳しく記載されています
qiita.com
Docker for Windowsの場合は、下記のURLが参考になります
qiita.comタスクトレイのDockerアイコン右クリック->Settingsを開く
Docker for Macの場合の場合、下記のURLが参考になります
qiita.com
Preferences → Advanced にあるMemoryで使用量を調節
[2] Gitのインストール
[3] Dockerプロジェクトのダウンロードと初期設定
- 任意のフォルダで、以下のコマンドを実行し、dockerプロジェクトをダウンロードします
> git clone https://github.com/rinne-grid/docker-for-intra-mart im
>cd im
>mkdir .\ap\war
[4] Jugglingでwarファイルを作成
プロジェクト名をimartにして、必要なモジュールを選択し、設定を行います。
今回のDocker環境をそのまま利用するためには、下記ファイルの設定を変更する必要があります
- storage-config.xmlを設定する
- resin-web.xmlを設定する
- 出力するwarファイル名をimart.warとする
(Dockerプロジェクトのap/.envファイルを変更することで、別の値を指定することも可能です)
storage-config.xmlの設定
imart/config/storage-config.xml の 19行目付近を以下のとおりに変更します
<root-path-name>/im-data/storage</root-path-name>
resin-web.xmlの設定
imart/resin-web.xml 内容を下記のとおりにします
<web-app xmlns="http://caucho.com/ns/resin"xmlnsresin="urn:java:com.caucho.resin"><character-encoding>UTF-8</character-encoding><log-handler name=""class="jp.co.intra_mart.common.platform.log.handler.JDKLoggingOverIntramartLoggerHandler"/><logger name="debug.com.sun.portal"level="warning" /><resource jndi-name="jca/work"type="jp.co.intra_mart.system.asynchronous.impl.executor.work.resin.ResinResourceAdapter" /><jsp><recycle-tags>false</recycle-tags></jsp><database jndi-name="jdbc/default"><driver><type>org.postgresql.Driver</type><url>jdbc:postgresql://db:5432/imart</url><user>imart</user><password>imart</password><init-param><param-name>preparedStatementCacheQueries</param-name><param-value>0</param-value></init-param></driver><max-connections>20</max-connections><prepared-statement-cache-size>8</prepared-statement-cache-size></database><session-config><reuse-session-id>false</reuse-session-id><session-timeout>30</session-timeout></session-config><mime-mapping extension=".json"mime-type="application/json"/></web-app>
warファイルの出力
imart.warという名称でwarファイルを出力したら、
プロジェクトのim/ap/warフォルダの中に、warファイルをコピーします
[5] intra-martのサイトからLinuxのresin-proをダウンロード
intr-martのサイトにアクセスし、プロダクトファイルダウンロードボタンを押下します。
www.intra-mart.jp
ライセンスキーを入力すると、ダウンロード可能なファイル一覧が表示されます。
なお、intra-martサイトにも書いているとおり、.tar.gzがLinux用のresin-proになります。
https://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/install/linux/resin_linux.html
最新のResinresin-pro-4.0.xx.tar.gzを入手します。
[6] 7zipをダウンロード、インストール
tar.gz形式のファイルを展開するため、この記事では7zipを利用します。
sevenzip.osdn.jp
- resin-pro.4.0.xx.tar.gzを展開します
- resin-pro.4.0.xx.tarファイルが作成されます
- resin-pro.4.0.xx.tarを展開します
- resin-pro.4.0.xxフォルダが作成されます
- resin-pro.4.0.xxフォルダの直下に、automake, binといったフォルダが存在することを確認します
![f:id:rinne_grid2_1:20180707183550p:plain f:id:rinne_grid2_1:20180707183550p:plain]()
[7] Dockerプロジェクトのフォルダにresin-proをコピー
- 上記の[6]の5のフォルダ「resin-pro.4.0.xx」の名称をresin-proに変更します
- resin-proフォルダをim/apフォルダにコピーします
[8] プロジェクトのフォルダ構成の確認
- フォルダを確認し、以下の構成と同じになっていることを確認します
- ポイント
- im/ap/resin-proフォルダがあり、直下にautomake等のファイルが存在する
- im/ap/warフォルダがあり、imart.warファイルが存在する
im
│ .env
│ .gitignore
│ docker-compose.yml
│ README.md
│
└─ap
│ Dockerfile
│
├─resin-pro
│ ├─automake など
│
└─war
imart.war
[9] 必要に応じて、設定ファイルを変更する
- im/ap/resin-pro/conf/resin.properties の 82行目付近 - jvm_args
-Xmx, -Xmsの値が、初期状態だと8192m(8GB)が設定されているため、自分のPCのメモリ状況に合わせて変更します
jvm_args : -Dfile.encoding=UTF-8 -Djava.io.tmpdir=tmp -Xmx1500m -Xms1500m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=30 -XX:NewSize=512m -XX:MaxNewSize=512m -XX:+CMSClassUnloadingEnabled -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -Xloggc:log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M
社内ネットワーク等で、プロキシサーバーを経由する必要がある場合、.envのHTTP_PROXY、HTTPS_PROXYに値を設定します
HTTP_PROXY=http://user:password@server:port/
HTTPS_PROXY=http://user:password@server:port/
[10] Docker Machineを起動
- Docker Machineを起動していない場合、下記コマンドで起動します
- Docker Toolbeltという青いアイコンのショートカットを起動すると、自動でDocker Machineを起動してくれます
![f:id:rinne_grid2_1:20180707183911p:plain f:id:rinne_grid2_1:20180707183911p:plain]()
> docker-machine start
[11] Dockerコンテナの起動
>cd any_folder\im
- docker-composeを利用し、コンテナを起動します
> docker-compose up --build-d
ネットワーク接続環境にもよりますが、早くて5分、おそくとも30分程度で完了します
http://192.168.99.100:8888
![f:id:rinne_grid2_1:20180707184327p:plain f:id:rinne_grid2_1:20180707184327p:plain]()
(Docker for WindowsやDocker for Macの場合は、上記IPアドレスではなくhttp://localhost:8888、もしくは自分で設定しているホスト名やIPアドレスにアクセスします。)
- resinのページが開けることが確認できたら、warファイルをデプロイします
> docker exec im_ap /ap-server/bin/resinctl deploy /war/imart.war
コンテナ内のresin-proの場所は、/ap-serverです。
im/.envファイル内の変数を変更することで、お好きな場所を指定できます。
- デプロイのコマンドが終了して、数分経ったらintra-martのセットアップページにアクセスします
- 503 Service Temporarily Unavailableが発生する場合は、もう少しだけ待ってあげてください。
http://192.168.99.100:8888/imart/system/login
- 無事にテナント設定画面が表示されるので、テナント環境セットアップを実行します
![f:id:rinne_grid2_1:20180707184846p:plain f:id:rinne_grid2_1:20180707184846p:plain]()
![f:id:rinne_grid2_1:20180707184958p:plain f:id:rinne_grid2_1:20180707184958p:plain]()
![f:id:rinne_grid2_1:20180707185043p:plain f:id:rinne_grid2_1:20180707185043p:plain]()
![f:id:rinne_grid2_1:20180707185142p:plain f:id:rinne_grid2_1:20180707185142p:plain]()
- テナント環境セットアップが適切に動作しているかどうかについては、Adminerからテーブル作成状況を参照することで確認できます
情報名 | 入力情報 |
---|
データベース情報 | PostgreSQL |
サーバ | db |
ユーザ名 | imart |
パスワード | imart |
データベース | imart |
- テーブルの作成状況が確認できます(だいたい500テーブルくらいができたら、処理完了です)
![f:id:rinne_grid2_1:20180707185642p:plain f:id:rinne_grid2_1:20180707185642p:plain]()
![f:id:rinne_grid2_1:20180707185835p:plain f:id:rinne_grid2_1:20180707185835p:plain]()
- データベースやストレージ情報はDocker Volumeに保存しているため、データは永続化されています
- 一度、docker-compose downで終了し、もう一度docker-compose upを試して、システムログイン画面にアクセスすると、ダッシュボードが表示されることがわかります
![f:id:rinne_grid2_1:20180707191944p:plain f:id:rinne_grid2_1:20180707191944p:plain]()
事象別のコマンドリファレンス
事象 | コマンド |
---|
Dockerコンテナを開始したい | docker-compose up |
Dockerコンテナをビルドして開始させたい | docker-compose up --build |
Dockerコンテナを終了させたい | docker-compose down |
DBデータやストレージを削除して、 新しくテナント環境セットアップから始めたい(永続化しているコンテナのがデータ全部消えるので要注意) | docker-compose up docker-compose down -v docker-compose up |
warファイルをアンデプロイしたい | docker exec im_ap /ap-server/bin/resinctl undeploy /war/imart.war |
warファイルをデプロイしたい | docker exec im_ap /ap-server/bin/resinctl deploy /war/imart.war |
コンテナごとの接続情報
コンテナ名 | ホスト名 | ポート番号(ホスト) | ポート番号(コンテナ) |
---|
im_ap | ap | 8888 | 8080 |
コンテナ名 | ホスト名 | DB名 | ユーザ名 | パスワード | ポート番号(ホスト) | ポート番号(コンテナ) |
---|
im_db | db | imart | imart | imart | 5432 | 5432 |
コンテナ名 | ホスト名 | ポート番号(ホスト) | ポート番号(ゲスト) |
---|
im_ap | adminer | 8889 | 8080 |
まとめ
resin-proの設定とwarファイルさえ作成してしまえば、
あとは数コマンド叩くだけで、すぐに使えるintra-martの検証環境が手に入りました。
1時間かかっていた構築作業が、15分程度で済みそうです。
また、慣れていない人に利用してもらう場合も、3時間から30分程度に削減できそうです。