気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【intra-mart】intra-martの検証環境をDockerを使って爆速で構築する(docker-for-intra-martで環境構築)

スポンサーリンク

こんにちは。

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を前提にしています。必要に応じて適宜読み替えをお願いします。)

[1] Docker Toolboxのインストール

  • 下記のURLより、Docker Toolboxをダウンロードし、インストールします docs.docker.com

[2] Dockerのメモリを増やす

  • Dockerで利用するメモリを確保するため、VirtualBoxから、メモリを増やしておきます。
    • 僕のPCはとりあえず5GBを設定しています
  • 下記のURLの記事にメモリを増やす方法が詳しく記載されています qiita.com

  • Docker for Windowsの場合は、下記のURLが参考になります qiita.com タスクトレイのDockerアイコン右クリック->Settingsを開く

  • Docker for Macの場合の場合、下記のURLが参考になります qiita.com Preferences → Advanced にあるMemoryで使用量を調節

[2] Gitのインストール

  • 下記のURLより、Git for Windowsをダウンロードし、インストールします gitforwindows.org

[3] Dockerプロジェクトのダウンロードと初期設定

  • 任意のフォルダで、以下のコマンドを実行し、dockerプロジェクトをダウンロードします
> git clone https://github.com/rinne-grid/docker-for-intra-mart im
> cd im
  • warファイルの配置用フォルダを作成します
> 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" xmlns:resin="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" />

    <!-- im_service(im_asynchronous) -->
    <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

  1. resin-pro.4.0.xx.tar.gzを展開します
  2. resin-pro.4.0.xx.tarファイルが作成されます
  3. resin-pro.4.0.xx.tarを展開します
  4. resin-pro.4.0.xxフォルダが作成されます
  5. resin-pro.4.0.xxフォルダの直下に、automake, binといったフォルダが存在することを確認します

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
  • HTTPプロキシの設定 im/.env

社内ネットワーク等で、プロキシサーバーを経由する必要がある場合、.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

> docker-machine start

[11] Dockerコンテナの起動

  • プロジェクトフォルダに移動します
> cd any_folder\im
  • docker-composeを利用し、コンテナを起動します
> docker-compose up --build -d

ネットワーク接続環境にもよりますが、早くて5分、おそくとも30分程度で完了します

  • resinのindexページに接続します

http://192.168.99.100:8888

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

  • テナントIDはimartを指定します

f:id:rinne_grid2_1:20180707184958p:plain

  • リソース参照名は一覧に表示されたものを選択します

f:id:rinne_grid2_1:20180707185043p: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:20180707185835p:plain

  • データベースやストレージ情報はDocker Volumeに保存しているため、データは永続化されています
    • 一度、docker-compose downで終了し、もう一度docker-compose upを試して、システムログイン画面にアクセスすると、ダッシュボードが表示されることがわかります

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

コンテナごとの接続情報

  • APサーバー(CentOS)
コンテナ名 ホスト名 ポート番号(ホスト) ポート番号(コンテナ)
im_ap ap 8888 8080
  • PostgreSQL
コンテナ名 ホスト名 DB名 ユーザ名 パスワード ポート番号(ホスト) ポート番号(コンテナ)
im_db db imart imart imart 5432 5432
  • Adminer
コンテナ名 ホスト名 ポート番号(ホスト) ポート番号(ゲスト)
im_ap adminer 8889 8080

まとめ

resin-proの設定とwarファイルさえ作成してしまえば、 あとは数コマンド叩くだけで、すぐに使えるintra-martの検証環境が手に入りました。 1時間かかっていた構築作業が、15分程度で済みそうです。

また、慣れていない人に利用してもらう場合も、3時間から30分程度に削減できそうです。