DockerでWebSphere LibertyとDB2を起動して接続する方法
IBM謹製アプリケーションサーバーのWebSphere Application Server(WAS)と、同じくIBMのRDBMSであるDB2をDockerコンテナで起動してコンテナ間接続してみたので手順メモ。
WAS Liberty
今回はWASのLibertyプロファイルのコンテナイメージを使います。
Libertyとはなんぞや?な方はこちら↓
WASの軽量版(語弊があるかも)ですね。コンテナではなく普通にローカル環境で立ち上げても起動が早いです。
WAS LibertyはDocker Hubに公式のイメージがあるのでありがたく使いたいと思います↓
DB2 Express-C
DB2も無料で使えるコミュニティエディション版であるExpress-CがDockerHubにありますのでそれを使います。
IBMは自社ソフトウェアのコンテナ化をどんどん推し進めているみたいで、使う側としてはありがたい限りですね!
コンテナ構成・定義
docker-compose.ymlにWASとDB2コンテナを定義して起動させます。
コンテナ構成
今回起動するコンテナの構成です。
WASコンテナとDB2コンテナを起動させますが、コンテナ間通信を行うにあたり、ネットワークをひとつ作成して、同一のネットワーク上に2つのコンテナを接続させたいと思います。
同一ネットワークにコンテナを接続させることにより、コンテナ間をホスト名・コンテナ名で名前解決できるようになります。
なお、docker-compose.ymlでコンテナを起動するとComposeがデフォルトでネットワークをひとつ作成し、コンテナを接続してくれます。
この機能により個別にネットワークを定義するといった必要は特にありません。
ちなみに、他にコンテナ間接続を行う方法としてlinks機能がありますが、現在は非推奨となっているため使わないようにします。
ディレクトリ構成
ディレクトリ構成は以下のようにします。
- dbディレクトリ以下にDB2コンテナ用のDockerfile
- webディレクトリ以下にWAS Libertyコンテナ用のDockerfile、サンプルwarファイル
- ルートに上記2コンテナの起動構成を定義したdocker-compose.yml
サンプル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コンテナからマウントするようにします。
環境変数 | 意味 |
---|---|
LICENSE | ソフトウェア仕様ライセンスへの同意を示す |
DB2INST1_PASSWORD | デフォルト(db2inst1)のパスワードを設定 |
docker-compose.ymlの詳細については以下も参照ください。
コンテナ起動
必要なものがそろったので、実際にコンテナを起動してみます。
まずはコンテナイメージをビルドします。(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
を指定します。
正常にサンプルアプリケーションがデプロイされており、アクセスできました!
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
実際に"Containers"の欄でapp
コンテナとdb2
コンテナが接続されていることが確認できました。
おわりに
今回はWebsphere LibertyとDB2コンテナを使ってコンテナ間接続の確認をしてみました。
個人開発ではおそらく使うことはないものかと思いますが、、、
業務で少し検証する必要があったので、試しでやってみました。
そして最後にもう一度書いておきますが、
コンテナ間接続を行うときはネットワーク機能を使いましょう。
links機能は非推奨になっています!
(links機能を使った説明のサイト・書籍がまだまだ多くあるので注意してください)