code & booze

自己学習とは無縁なSIer業界に身を置くエンジニアがアウトプットします

DockerでWebSphere LibertyとDB2を起動して接続する方法

f:id:kiy-s:20190303145030p:plain

IBM謹製アプリケーションサーバーのWebSphere Application Server(WAS)と、同じくIBMRDBMSであるDB2をDockerコンテナで起動してコンテナ間接続してみたので手順メモ。

WAS Liberty

今回はWASのLibertyプロファイルのコンテナイメージを使います。
Libertyとはなんぞや?な方はこちら↓

www.ibm.com

WASの軽量版(語弊があるかも)ですね。コンテナではなく普通にローカル環境で立ち上げても起動が早いです。
WAS LibertyはDocker Hubに公式のイメージがあるのでありがたく使いたいと思います↓

DB2 Express-C

DB2も無料で使えるコミュニティエディション版であるExpress-CがDockerHubにありますのでそれを使います。

IBMは自社ソフトウェアのコンテナ化をどんどん推し進めているみたいで、使う側としてはありがたい限りですね!

tech.nikkeibp.co.jp

コンテナ構成・定義

docker-compose.ymlにWASとDB2コンテナを定義して起動させます。

コンテナ構成

f:id:kiy-s:20190314002023p:plain

今回起動するコンテナの構成です。

WASコンテナとDB2コンテナを起動させますが、コンテナ間通信を行うにあたり、ネットワークをひとつ作成して、同一のネットワーク上に2つのコンテナを接続させたいと思います。

同一ネットワークにコンテナを接続させることにより、コンテナ間をホスト名・コンテナ名で名前解決できるようになります。

なお、docker-compose.ymlでコンテナを起動するとComposeがデフォルトでネットワークをひとつ作成し、コンテナを接続してくれます。

この機能により個別にネットワークを定義するといった必要は特にありません。

docs.docker.com

ちなみに、他にコンテナ間接続を行う方法としてlinks機能がありますが、現在は非推奨となっているため使わないようにします。

ディレクトリ構成

ディレクトリ構成は以下のようにします。

  • dbディレクトリ以下にDB2コンテナ用のDockerfile
  • webディレクトリ以下にWAS Libertyコンテナ用のDockerfile、サンプルwarファイル
  • ルートに上記2コンテナの起動構成を定義したdocker-compose.yml

f:id:kiy-s:20190314230527p:plain

サンプルwarファイルは何でも良いですが、無い場合はApache Tomcatのサイトからダウンロードできるのでそれをデプロイします。

DB2のDockerfile定義

DB2のコンテナイメージのみ指定します。

FROM ibmcom/db2express-c:latest

WAS LibertyのDockerfile定義

WAS Libertyのコンテナイメージの指定とwarファイルのコピーコマンドを定義します。
また、疎通確認でnpingコマンドを使用するためにnmapをインストールします。

FROM websphere-liberty:18.0.0.3-webProfile8

USER root
RUN apt-get -y update && apt-get install -y nmap

COPY ./app/sample.war /config/dropins/

※WAS Libertyではdropinsフォルダにwarファイルを配置するとサーバーにデプロイされます。
※Tagは今回はwebProfile8を指定しますがlatestでも問題ありません。

docker-compose.ymlの定義

version: '3'
services:
  web:
    build: ./web
    container_name: app
    ports:
      - "9080:9080"
      - "9443:9443"
    depends_on:
      - db
  db:
    build: ./db
    container_name: db2
    ports:
      - "50000:50000"
    environment:
      - LICENSE=accept
      - DB2INST1_PASSWORD=Zaq12wsx
    volumes:
      - db-data:/home
    command: db2start

volumes:
  db-data:

WASとDB2コンテナをそれぞれweb/dbという2つのサービスで定義します。
また、db-dataというvolumeを定義し、DB2コンテナからマウントするようにします。

db2環境変数の意味は以下の通りです。

環境変数 意味
LICENSE ソフトウェア仕様ライセンスへの同意を示す
DB2INST1_PASSWORD デフォルト(db2inst1)のパスワードを設定

docker-compose.ymlの詳細については以下も参照ください。

docs.docker.com

コンテナ起動

必要なものがそろったので、実際にコンテナを起動してみます。

まずはコンテナイメージをビルドします。(DB2のイメージはサイズがでかいのでpullに時間がかかるかも。。)

ルートディレクトリでビルドコマンドを実行。

$ docker-compose build
~略~
Successfully built 7aa154d9b73c
Successfully tagged was_db:latest
~略~
Successfully built c7bf01ff064e
Successfully tagged was_web:latest

↑のような感じで出力されればビルドが無事完了しているので、いよいよコンテナを起動してみます。

$ docker-compose up -d
Creating network "was_default" with the default driver
Creating volume "was_db-data" with default driver
Creating db2 ... done
Creating app ... done

起動しました!

まずwasにアクセスして確認をしてみます。docker toolboxを使っている方はdocker-machine lsコマンドでIPアドレスを確認します。

$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.09.0

URL欄の192.168.99.100の部分を以下のように指定してアクセスします。

http://<URL欄のIP>:9080/sample/

なお、Docker Desktop for Mac/Windowsを使用している場合は、localhostを指定します。

f:id:kiy-s:20190314235819p:plain

正常にサンプルアプリケーションがデプロイされており、アクセスできました!

WAS - DB2コンテナ間接続確認

次に、WASコンテナからDB2コンテナへ接続確認を行います。
本来であればDBへ接続するアプリケーションを使って確認するのが良いですが、今回はnpingによる疎通確認にとどめます。

docker execコマンドでWASコンテナでbashを起動してpingを実行します。

$ docker exec -it app bash
root@03ec39809114:/# nping -c3 db -p 50000 --tcp

Starting Nping 0.7.01 ( https://nmap.org/nping ) at 2019-03-23 03:13 UTC
SENT (0.0245s) TCP 172.22.0.3:4934 > 172.22.0.2:50000 S ttl=64 id=58832 iplen=40  seq=484652880 win=1480
RCVD (0.2170s) TCP 172.22.0.2:50000 > 172.22.0.3:4934 SA ttl=64 id=0 iplen=44  seq=3067265246 win=29200 <mss 1460>
SENT (1.0253s) TCP 172.22.0.3:4934 > 172.22.0.2:50000 S ttl=64 id=58832 iplen=40  seq=484652880 win=1480
RCVD (1.0482s) TCP 172.22.0.2:50000 > 172.22.0.3:4934 SA ttl=64 id=0 iplen=44  seq=3082901412 win=29200 <mss 1460>
SENT (2.0277s) TCP 172.22.0.3:4934 > 172.22.0.2:50000 S ttl=64 id=58832 iplen=40  seq=484652880 win=1480
RCVD (2.0883s) TCP 172.22.0.2:50000 > 172.22.0.3:4934 SA ttl=64 id=0 iplen=44  seq=3098564564 win=29200 <mss 1460>

Max rtt: 192.383ms | Min rtt: 22.758ms | Avg rtt: 91.852ms
Raw packets sent: 3 (120B) | Rcvd: 3 (132B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 2.11 seconds

npingで指定しているdbはdocker-compose.ymlで定義したservice名です。

ユーザ定義ネットワーク(今回はComposeによって作成されたモノ)機能を使うことにより、Dockerデーモンに内蔵されたDNSサーバによって名前解決を行ってくれるようになります。

docker-composeによって作られたネットワークを確認してみます。

$ docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
ade50cd0acae        bridge                bridge              local
a9a4a7f81fb8        host                  host                local
800f8929d4a9        none                  null                local
0b6652d9b7ac        was_default           bridge              local

ネットワークの一覧を確認するといくつか出力されると思いますが、was_defaultがComposeにより作成されたネットワークです。(wasの部分はルートディレクトリ名になります)

ではこのネットワークの詳細を確認してみます。

$ docker inspect was_default

f:id:kiy-s:20190323121718p:plain

実際に"Containers"の欄でappコンテナとdb2コンテナが接続されていることが確認できました。

おわりに

今回はWebsphere LibertyとDB2コンテナを使ってコンテナ間接続の確認をしてみました。

個人開発ではおそらく使うことはないものかと思いますが、、、
業務で少し検証する必要があったので、試しでやってみました。

そして最後にもう一度書いておきますが、

コンテナ間接続を行うときはネットワーク機能を使いましょう。
links機能は非推奨になっています!
(links機能を使った説明のサイト・書籍がまだまだ多くあるので注意してください)