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

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

【intra-mart】[Oracle環境]イントラマートの検証環境をDocker Composeで構築する(Oracle Database版)

スポンサーリンク

以前イントラマートの検証環境構築に関して、以下の記事を書きました。

www.rinsymbol.net

上記のイントラマート環境はPostgreSQLを利用していました。
機能検証ならば、PostgreSQLでも十分なのですが、やはり実際に開発環境として利用する際には 運用環境で動いているDB(Oracle Database)とあわせるべきだと考え、Oracle Database版を作成しました。

Docker関係のプロジェクト配置先(Githubリポジトリ)

github.com

Dockerでやること

  • JDKのインストール
  • resin-proのセットアップ
    • CentOSのインストール
    • resinのmakeに必要なパッケージ・ライブラリのインストール
    • make実行
  • データベースのセットアップ
    • データベース作成
    • スキーマ、ユーザ作成
    • 権限付与

手動でやること

  • Oracle Database 12.2.0.1.0のダウンロードと対象フォルダへの配置
  • JDBCドライバ(ojdbc8.jar)のダウンロードと対象フォルダへの配置
  • 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 Oracle Database 12.2.0.1.0(ビルドで作成) 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

事象別のコマンドリファレンス

事象 コマンド
Dockerコンテナを開始したい docker-compose up
Dockerコンテナをビルドしたい docker-compose build --no-cache
Dockerコンテナを終了させたい docker-compose down
DBデータやストレージを削除して、
新しくテナント環境セットアップから始めたい(永続化しているコンテナのデータが全部消えるので要注意)
docker-compose up
docker-compose down -v
docker-compose up
warファイルをアンデプロイしたい docker-compose exec ap /ap-server/bin/resinctl undeploy imart
warファイルをデプロイしたい docker-compose exec ap /ap-server/bin/resinctl deploy /war/imart.war
Oracleイメージを単独で作成したい docker build -t oracle12c_local:latest ./db/build --build-arg DB_EDITION=SE2

コンテナごとの接続情報

  • APサーバー(CentOS)
コンテナ名 ホスト名 ポート番号(ホスト) ポート番号(コンテナ)
im_ap_n ap 8888 8080
  • Oracle Database
コンテナ名 ホスト名 DB名 ユーザ名 パスワード ポート番号(ホスト) ポート番号(コンテナ)
im_db_n db IMART IMART IMART 15210 1521
  • Adminer
コンテナ名 ホスト名 ポート番号(ホスト) ポート番号(ゲスト)
im_adminer_n adminer 8889 8080

利用手順の前に、よくあるエラー

  • ビルドに失敗する→im/db/buildの中のシェルスクリプト(sh)がCRLFになっている可能性があるので、LFにする
  • 表領域やスキーマ作成に失敗する→im/db/scripts_startupの中のシェルスクリプト(01_create_imart.sh)がCRLFになっている可能性があるので、LFにする

利用手順

本Dockerプロジェクトを利用して、intra-martの環境を構築する手順を記述します。 (この手順は、Windows10 + Docker Toolboxを前提にしています。必要に応じて適宜読み替えをお願いします。)

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

[2] Dockerのメモリ、ストレージを増やす

Oracle Databaseをインストールする際、空きディスク容量は15GB以上必要とのことです。

下記のコマンドで新たにdocker-machineを作ります。 この記事では、ディスクサイズ50GB、メモリは8GBにしました。 必要に応じて各数値は変更してください。

$ docker-machine create -d virtualbox --virtualbox-disk-size 50000 --virtualbox-memory "8192" default

[2] Gitのインストール

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

  • 任意のフォルダで、以下のコマンドを実行し、dockerプロジェクトをダウンロードします
> git clone https://github.com/rinne-grid/docker-for-intra-mart-v-oracle12c-12.2.0.1.0 im
> cd im
  • warファイルの配置用フォルダを作成します
> mkdir .\ap\war

[4] Oracle Database 12.2.0.1.0をダウンロードします

[5] 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>oracle.jdbc.driver.OracleDriver</type>
           <url>jdbc:oracle:thin:@db:1521/RNGD</url>
            <user>IMART</user>
            <password>IMART</password>
        </driver>
        <max-connections>20</max-connections>
        <prepared-statement-cache-size>0</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ファイルをコピーします

[6] intra-martのサイトからLinuxのresin-proをダウンロード

ライセンスキーを入力すると、ダウンロード可能なファイル一覧が表示されます。

なお、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

最新のResin (resin-pro-4.0.xx.tar.gz)を入手します。

[7] Dockerプロジェクトのフォルダにresin-proをコピー

  • 上記のresin-pro.4.0.xxを展開し「resin-pro.4.0.xx」の名称をresin-proに変更します
  • resin-proフォルダをim/apフォルダにコピーします

[8] JDBCドライバー(ojdbc8.jar)をダウンロードし、im/ap/resin-pro/libにコピー

[9] プロジェクトのフォルダ構成の確認

  • フォルダを確認し、以下の構成と同じになっていることを確認します
  • ポイント
    • im/ap/resin-proフォルダがあり、直下にautomakeやlibフォルダ等が存在する
    • im/ap/resin-pro/libフォルダ内にodbc8.jarファイルが存在する
    • im/ap/warフォルダがあり、imart.warファイルが存在する
    • im/db/buildフォルダ内にlinuxx64_12201_database.zipが存在する
im
├─ap
│  │
│  ├─resin-pro
│  │  ├─lib
│  │  │   ├─ojdbc8.jar
│  │  │   │
│  │  │   ├─activation.jar など
│  │  │          
│  │  ├─automake  など
│  │
│  ├─war
│  │  └─imart.war
│  │
│  └─Dockerfile
│
├─db
│  ├─build
│  │  ├─linuxx64_12201_database.zip
│  │  │
│  │  ├─checkDBStatus.sh など
│  │
│  ├─scripts_setup
│  │  └─01_create_imart.sh
│  │   
│  └─scripts_startup
│
├─.env
├─.gitignore
├─docker-compose.yml
└─README.md

[10] 必要に応じて、設定ファイルを変更する

  • 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 -Xmx4096m -Xms4096m -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/

[11] Docker Machineを起動

  • Docker Machineを起動していない場合、下記コマンドで起動します
    • Docker Toolbeltという青いアイコンのショートカットを起動すると、自動でDocker Machineを起動してくれます

docker-toolbelt

> docker-machine start

[12] Dockerコンテナの起動

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

イメージ作成の際にアップデート等の処理が走るので、30分程度~1時間程度かかります。

terminalにいろいろと出力されていきます。 以下の表示が出たら終了と判断して良いと思います。Ctrl+C等でを強制終了します。

db_1       | #########################
db_1       | DATABASE IS READY TO USE!
db_1       | #########################
db_1       | The following output is now a tail of the alert.log:
db_1       | EXTENT MANAGEMENT LOCAL AUTOALLOCATE
db_1       | SEGMENT SPACE MANAGEMENT AUTO
db_1       | 2019-03-07T14:11:29.343682+00:00
db_1       | RNGD(3):Completed: CREATE TABLESPACE IMART
db_1       | DATAFILE '/opt/oracle/oradata/ORCL/XXXX/IMART.dbf' SIZE 7000M REUSE
db_1       | LOGGING
db_1       | ONLINE
db_1       | BLOCKSIZE 8K
db_1       | EXTENT MANAGEMENT LOCAL AUTOALLOCATE

ホストマシン側からOracle Databaseに接続したい場合は下記の指定を行います。

(設定を変更していない場合)

ユーザID パスワード SID
IMART IMART 192.168.99.100:15210/RNGD

(Docker for WindowsやDocker for Macの場合は、上記IPアドレスではなく localhost:15210 もしくは自分で設定しているホスト名やIPアドレスを指定します。)

docker-toolbelt

(Docker for WindowsやDocker for Macの場合は、上記IPアドレスではなく http://localhost:8888 もしくは自分で設定しているホスト名やIPアドレスにアクセスします。)

  • resinのページが開けることが確認できたら、warファイルをデプロイします
> docker-compose exec 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

  • 無事にテナント設定画面が表示されるので、テナント環境セットアップを実行します

tenant1

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

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

tenant3

  • テナント登録を行い、しばらく待ちます

tenant4

  • テナント環境セットアップが適切に動作しているかについて、ログを確認したい場合以下のコマンドを実行します
$ docker-compose exec ap bash
$ less -f ./log/jvm-app-0.log
  • データベースやストレージ情報はDocker Volumeに保存しているため、データは永続化されています
    • 一度、docker-compose downで終了し、もう一度docker-compose upを試して、システムログイン画面にアクセスすると、ダッシュボードが表示されることがわかります

dashboard

Oracle DatabaseやJDBCドライバのダウンロードなど 初回Dockerイメージ作成時はそれなりに時間がかかります。

しかし、一度Dockerイメージさえできてしまえば、すぐに新たな環境で 開発を始めることができるため、非常に便利だと思いました。

数ヶ月前から、Oracle版を導入したいと考えてたのですが、 Oracle DatabaseのDockerイメージのビルドがうまくいかず、ドはまりして諦めかけていましたが なんとか完了させることができて良かったです。