Dockerコンテナ上にWebLogic Serverのクラスターを構成する

先日のWebLogic Server勉強会 特別編では、DockerコンテナでWebLogic Serverのクラスターを構成するデモを紹介しました。

Oracle公式のDockerfileのリポジトリにいくとreadmeにコマンドの使い方が記載されていますが、勉強会では若干アレンジして使っていた部分があります。
本記事では、その時に使用したコマンドの詳細を解説したいと思います。

前提条件

Dockerのホストマシンに、Oracle公式のDockerfileとスクリプトをダウンロードして、配置しておきます。本記事では、"~/sync"配下にこれらのファイルが配置されているものとします。

また、JDKWebLogic Serverのインストーラを別途ダウンロードし、所定のパスに配置する必要があります。
以下のようなディレクトリ構成になるよう、配置して下さい((※)がダウンロードして追加したファイルです)。

~/sync
├── GlassFish
│   └── …
├── MySQL
│   └── …
├── NoSQL
│   └── …
├── OpenJDK
│   └── …
├── OracleCoherence
│   └── …
├── OracleJDK
│   └── …
└── OracleWebLogic
     ├── COPYRIGHT
     ├── dockerfiles
     │   ├── 12.1.3
     │   │   └── …
     │   ├── 12.2.1
     │   │   ├── Dockerfile.developer
     │   │   ├── Dockerfile.generic
     │   │   ├── Dockerfile.infrastructure
     │   │   ├── fmw_12.2.1.0.0_infrastructure_Disk1_1of1.zip.download
     │   │   ├── fmw_12.2.1.0.0_wls_Disk1_1of1.zip.download
     │   │   ├── fmw_12.2.1.0.0_wls_quick_Disk1_1of1.zip(※)
     │   │   ├── fmw_12.2.1.0.0_wls_quick_Disk1_1of1.zip.download
     │   │   ├── install.file
     │   │   ├── oraInst.loc
     │   │   ├── server-jre-8u73-linux-x64.tar.gz(※)
     │   │   ├── server-jre-8u73-linux-x64.tar.gz.download
     │   │   └── …
     │   └── buildDockerImage.sh
     ├── LICENSE
     ├── README.md
     └── samples
         ├── 1213-domain
         │   ├── Dockerfile
         │   ├── README.md
         │   └── …
         ├── 1221-appdeploy
         │   └── …
         ├── 1221-docker-compose
         │   └── …
         ├── 1221-domain
         │   ├── container-scripts
         │   │   ├── add-machine.py
         │   │   ├── add-server.py
         │   │   ├── commonfuncs.py
         │   │   ├── createMachine.sh
         │   │   ├── createServer.sh
         │   │   ├── create-wls-domain.py
         │   │   └── waitForAdminServer.sh
         │   ├── Dockerfile
         │   └── README.md
         ├── 1221-medrec
         │   └── …
         ├── 1221-multihost
         │   └── …
         ├── 1221-webtier-apache
         │   └── …
         ├── clean-up-docker.sh
         └── rm-containers.sh

ツリーをよく見ると、気になる名前のディレクトリが結構ありますね。個人的には、GrassFish、CoherenceFusion Middleware Infrastractureのイメージ当たりを、後々試したいところです。

コマンドの説明

以下、コマンド群の説明です。

1. Install Imageの作成

はじめに、WebLogic ServerのInstall Imageを作成します。Install Imageは、Docker HubのOracle Linuxのイメージに、JDKWebLogicインストーラを適用したものです。

$ cd ~/sync/OracleWebLogic/dockerfiles
$ ./buildDockerImage.sh -v 12.2.1 -d

このコマンドでは、Oracle公式のスクリプトを介してdocker buildコマンドを実行しています。オプションの意味は以下のとおりです。

  • -v 12.2.1
  • -d
    • WebLogicを開発者モードでインストールする

2. Domain Imageの作成

次にWebLogic ServerのDomain Imageを作成します。Domain Imageは、Install Imageをベースにして空のWLSドメインを構成したものです。
以下のようにdocker runコマンドを実行します。

$ cd ~/sync/OracleWebLogic/samples/1221-domain
$ docker build -t oracle/1221-domain --build-arg ADMIN_PASSWORD=welcome1 .

このコマンドで実行されるDockerfileでは、ドメインを構成するWLSTを呼び出すよう記述されています。オプションの意味は以下のとおりです。

  • -t oracle/1221-domain
    • このコマンドで作成されるイメージの名前
  • --build-arg ADMIN_PASSWORD=welcome1
    • WebLogicの管理者ユーザーのパスワード

3. 管理サーバーの起動

管理サーバーを起動します。Domain Imageを指定してdocker runコマンドを実行します。

(※実際には1行)
$ docker run
    -v /vagrant:/tmp/shared --privileged=true
    -p 8001:8001 --hostname=wlsadmin
    --name=wlsadmin
    oracle/1221-domain

オプションの意味は以下のとおりです。

  • -v /vagrant:/tmp/shared
    • Dockerのホストとコンテナとの共有フォルダの指定。上記の場合、ホストの/vagrant配下のファイル、ディレクトリが、コンテナの/tmp/shared配下に共有されます
  • --privileged=true
    • 共有フォルダ(/tmp/shaared)へのアクセス権を与える
  • -p 8001:8001
    • ホストの8001番ポートを、コンテナの8001番ポートにフォワードする
  • --hostname=wlsadmin
    • コンテナホスト名の指定
  • oracle/1221-domain
    • 使用するイメージの名前

-vオプションでコンテナからホストのファイルを参照できるようにしています。これは、コンテナ上で動作するアプリケーションから、アプリで使用するデータを参照させるためです。
このようなやり方をすると、アプリケーションのためにデータを転送する手間が省けて便利です。

このコマンドでは、runの時に実行されるコマンドを明示的に指定していませんので、イメージ作成時にDockerfileで指定されたコマンドが実行されます。

    # Define default command to start bash.
    CMD ["startWebLogic.sh"]

Domain ImageのDockerfileでは、startWebLogic.shが指定されているので、これが実行されます。

また、-dオプションをつけていないので、フォアグラウンドでstartWebLogic.shが実行されます。管理サーバーの標準出力が表示され続けて操作が帰ってこないので、以降は別のターミナルで作業します。
Dockerコンテナは、ホスト上の1つのプロセスとして実行されていますが、それを体感できる挙動だと思います。

4. 管理対象サーバーの起動

管理対象サーバーを起動します。管理サーバーのときと同じく、Domain Imageを指定してdocker runコマンドを実行します。

(※実際には1行)
$ docker run
    -d
    -v /vagrant:/tmp/shared
    --privileged=true
    -p 5556:5556 -p 7001:7001 --hostname=wlsmanaged0
    --link wlsadmin:wlsadmin
    --name=wlsmanaged0
    oracle/1221-domain
    createServer.sh

オプションの意味は以下のとおりです(管理サーバーと同じものは省略)。

  • -d
    • バックグラウンドでコンテナコンテナを実行する
  • -p 5556:5556 -p 7001:7001
    • ホストの5556/7001番ポートをコンテナの5556/7001番ポートにフォワードする
  • --link wlsadmin:wlsadmin
    • 接続先の管理サーバー(wlsadmin)に対するエイリアス名の設定
  • --hostname=wlsmanaged0
    • コンテナホスト名の指定
  • createServer.sh
    • コンテナ起動時に実行するコマンド

管理サーバーと同じように、-vオプションで、ホスト上の同じファイルを参照できるようにしています。このようにすると、WebLogic Serverドメイン内の各サーバーから同じファイルを参照できるので、アプリケーション用のデータをサーバーごとに用意する手間が省けます。

--linkオプションは、WLSTで管理サーバーに接続する際の、接続先のエイリアスを設定しています。後述のcreateServer.shからWLSTで管理サーバーに接続しますが、WLSTのスクリプトは、wlsadminというエイリアスで接続先を指定しています。これが実際の管理サーバーのホスト名に紐づくようにしています。
この例では、ホスト名もエイリアスも同じ名前になっていますが、"wlsadmin:wlsamdin"の先に記述した方が接続先の実際の名前で、後に記述した方がエイリアスです。

このコマンドでは、コンテナ起動時にcreateServer.shを実行するよう指定しています。 createServer.shでは、管理対象サーバー、ノードマネージャの起動、WLSTによるマシン、サーバー、クラスターの構成をおこないます(wlsmanaged0からwlsamdinに対してWLSTを実行)。

管理対象サーバーを複数起動する場合は、ホスト名とポートフォワードの値だけを変えて、同じコマンドを実行すればOKです。

$ docker run
    -d
    -v /vagrant:/tmp/shared --privileged=true
    -p 15556:5556 -p 17001:7001 --hostname=wlsmanaged1
    --link wlsadmin:wlsadmin
    --name=wlsmanaged1
    oracle/1221-domain
    createServer.sh

数十秒程度待ってからWebLogic Server 管理コンソールを見ると、管理対象サーバー2つを含むクラスターが構成されているはずです。

その他知っておくと役に立つコマンド

イメージやコンテナを操作する上で、よく使うコマンドを以下に挙げておきます。コンテナ名やイメージ名は、これまでのコマンドを使った場合の実際の値になっているので、それ以外の場面で使うときは適宜読み替えてください。

コンテナの停止、起動

1つのコンテナを停止

docker stop wlsadmin

複数のコンテナを停止

docker stop wlsadmin wlsmanaged0 wlsmanaged1

1つのコンテナを起動

docker start wlsadmin

1つのコンテナをフォワグラウンドで起動

docker start -a wlsadmin

複数のコンテナを起動

docker start wlsadmin wlsmanaged0 wlsmanaged1

コンテナの一覧

起動中のコンテナの一覧

docker ps

全てのコンテナの一覧

docker ps -a

コンテナの削除

1つのコンテナを削除

docker rm wlsadmin

複数削除は停止、起動と同様)

イメージの削除

Domain Imageの削除

docker rmi oracle/weblogic:12.2.1

Install Imageの削除

docker rmi oracle/1221-domain

コンテナIPの確認

sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' wlsmanaged0

覚えるのが面倒であれば、以下のやり方でも十分です。

sudo docker inspect wlsmanaged0 | grep IP

以上、DockerコンテナでWebLogic Serverのクラスターを構成する際の、コマンドの解説でした。