IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（7.WebSphere Liberty コンテナの準備）

#はじめに

「[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)」の　第7回です。
ここでは、 コンテナの準備ついて記載します。


実施内容は以下の通りです。

- WebSphere Liberty コンテナの取得
- 関連ファイルの配置
- Docker ファイルの作成・ビルド
- イメージの IBM Cloud Container Registry への登録

ベースのコンテナイメージとして、 WebSphere Liberty アプリケーションサーバーを利用します。
正確には Open Liberty で、サポートはありませんが無償で検証等で利用することができます。

#WebSphere Liberty コンテナの取得

ベースとなる Liberty イメージは [Docker Hub](https://hub.docker.com/) から取得します。
IBM Cloud CLI を導入した Linux を使って実施します。（Docker も導入されているはずです）

[Docker Hub](https://hub.docker.com/) から　「WebSphere-liberty」で検索すると
Liberty のイメージがヒットします。

![61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/d3e2166f-aa22-3480-45e5-8c346c8ae80b.png)

内容を見ると、kernel というタグがあることがわかります。
また、イメージの使い方についても簡単な説明がありますので、一通り目を通しておきます。
（後述する、ユーザーID なども記載されています）

Docker 導入・起動済みの Linux 上から以下のコマンドで WebSphere-Liberty のイメージを取得します。

```console
# docker pull websphere-liberty:kernel
kernel: Pulling from library/websphere-liberty
5d9821c94847: Pull complete
a610eae58dfc: Pull complete
a40e0eb9f140: Pull complete
ce03bf3de33a: Pull complete
d26a401e3cfc: Pull complete
7c8d5d75e559: Pull complete
deaa1a0c4db8: Pull complete
bd803d95ded0: Pull complete
6a3c56e2964a: Pull complete
ae3986011977: Pull complete
a55f77d5aa37: Pull complete
299a2589f823: Pull complete
Digest: sha256:9312eecbfe9d85677857eb40a55cc90c2ccd32005dad2f6a6cbfc4bef5dfbdb3
Status: Downloaded newer image for websphere-liberty:kernel
docker.io/library/websphere-liberty:kernel

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
websphere-liberty   kernel              878137168ed8        5 days ago          311MB
```

これで、 WebSphere-Liberty のイメージが取得できました。簡単ですね。

#関連ファイルの配置

さて、 取得済みの WebSphere-Liberty のイメージをベースに、
第6回で作成したアプリケーションや各種設定なども含めたイメージを作成します。
その準備として、必要なファイルを用意します。

作業用ディレクトリ（図中 "." ）以下に　ツリー上にファイルを配置します。
（作業用ディレクトリ内のディレクトリ構成は違っていても構いません。後述の DockerFile 作成時にコンテナ内の必要な場所にコピーすることになります。

![62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/b00cd782-1379-1bb9-666b-15095efbe1af.png)

以下に、ファイルとその内容について補足していきます。

##DockerFile

これは、次の章で記載しますのでここでは割愛します。

##LibertyCounter.war

これは、[第6回](https://qiita.com/shimauma_Zzzzz/items/ced44370c6d3d47c8db6)で作成した war ファイルを sftp 等で配置します。（手順略）

##db2jcc4.jar

Db2 にアクセスするための JDBC ドライバーです。
[DB2 JDBC Driver Versions and Downloads](https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads) から取得します。 バージョンは、 IBM Cloud でオーダーした Db2 に合わせて v11.1 の物を用います。
（特殊なことはしませんので、多少バージョンが違うものでも稼働すると思います。）

ダウンロードの詳細な手順は割愛しますが、 IBM ID が必要になりますのでご留意ください。
2020/09 時点では、ダウンロードできるファイル名は　「v11.1.4fp5_jdbc_sqlj.tar.gz」になりますが、
そのファイルを何度か展開し、　中にある  db2jcc4.jar  ファイルを取得します。　他のものは不要です。

##server.xml

これは、WebSphere-Liberty のメインの設定ファイルです。
この中で各種設定を行っています。　まず全文を記載したのち、個別部分に補足を入れます。
下記のもののオリジナルのファイルを入手したい場合、
WebSphere-Liberty イメージからコンテナを1つ生成し、その中の `/config` 以下から取得してください。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="Default server">

    <!-- Enable features -->
    <featureManager>
        <feature>jndi-1.0</feature>
        <feature>webProfile-8.0</feature>
    </featureManager>

    <!--For a user registry configuration, configure your user registry. For example, configure a basic user registry using the
        basicRegistry element. Specify your own user name below in the name attribute of the user element. For the password,
        generate an encoded password using bin/securityUtility encode and add it in the password attribute of the user element.
        Then uncomment the user element. -->
    <basicRegistry id="basic" realm="BasicRealm">
        <!-- <user name="yourUserName" password="" />  -->
    </basicRegistry>

    <!-- To allow access to this server from a remote client host="*" has been added to the following element -->
    <httpEndpoint id="defaultHttpEndpoint"
                  host="*"
                  httpPort="9080"
                  httpsPort="9443" />

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>

    <dataSource id="dataSource01" jndiName="jdbc/sample" type="javax.sql.ConnectionPoolDataSource" containerAuthDataRef="dbuser" recoveryAuthDataRef="dbuser">
        <properties.db2.jcc
            serverName="${env.DB_SERVERNAME}"
            portNumber="${env.DB_PORT}"
            databaseName="${env.DB_DBNAME}"
        />
        <jdbcDriver>
            <library>
                <fileset dir="${DB2_JCC_DRIVER_PATH}" includes="db2jcc4.jar"/>
            </library>
        </jdbcDriver>
        <connectionManager minPoolSize="1" maxPoolSize="2" purgePolicy="EntirePool">
        </connectionManager>
    </dataSource>

    <authData id="dbuser" user="${env.DB_USERNAME}" password="${env.DB_PASSWORD}">
    </authData>

</server>

```

`<feature>` 部分では、利用する機能を指定します。 Web系の簡単なアプリケーションであれば webProfile-8.0 があれば大丈夫です。（また、他に必要なものがあれば、依存関係に基づき自動的にロードされます）

```xml
    <featureManager>
        <feature>jndi-1.0</feature>
        <feature>webProfile-8.0</feature>
    </featureManager>
```

httpEndpoint では使用するポートを指定しています。
今回は HTTP で 9080 ポートにアクセスします。

```xml
    <httpEndpoint id="defaultHttpEndpoint"
                  host="*"
                  httpPort="9080"
                  httpsPort="9443" />
```

以下の設定は　データソースの設定です。
JNDI 名として、 `jdbc/sample` を記載（アプリケーション側でハードコードしたものです。ここでもハードコード…（外に出し忘れました。。。））
env. から始まる変数は環境変数から取得します。
`${env.DB_SERVERNAME}`　： DB_SERVERNAME 環境変数から DBサーバーの名前を取得します
`${env.DB_PORT}` : DB_PORT 環境変数から DB のポート番号を取得します。
`${env.DB_DBNAME}` : DB_DBNAME 環境変数から DB名を取得します。

```xml
    <dataSource id="dataSource01" jndiName="|" type="javax.sql.ConnectionPoolDataSource" containerAuthDataRef="dbuser" recoveryAuthDataRef="dbuser">
        <properties.db2.jcc
            serverName="${env.DB_SERVERNAME}"
            portNumber="${env.DB_PORT}"
            databaseName="${env.DB_DBNAME}"
        />
```

次に JDBC Driver の設定です。
変数のうち、 env. ではないものは、　次に説明する  server.env ファイルから取得します。
`${DB2_JCC_DRIVER_PATH}` : JDBC Driver ファイル (db2jcc4.jar) のコンテナ内でのパスを server.env から取得します。

`minPoolSize="1" maxPoolSize="2"` : DB接続プールを最小 1,  最大 2 に設定します。
IBM Cloud の無料 Db2 は最大接続数が 30 のため、最大を 10 などに設定していると、コンテナが増えたときにすぐ最大接続数に到達してエラーになります。そのため、低めの 2 に設定しています。

```xml
        <jdbcDriver>
            <library>
                <fileset dir="${DB2_JCC_DRIVER_PATH}" includes="db2jcc4.jar"/>
            </library>
        </jdbcDriver>
        <connectionManager minPoolSize="1" maxPoolSize="2" purgePolicy="EntirePool">
        </connectionManager>
```

2つ上のボックスで、 dbuser という形で（ファイル内で）参照している DB関連のユーザー情報です。
これも、 env. を使い、環境変数から DBユーザー名とパスワードを取得しています。

```xml
    <authData id="dbuser" user="${env.DB_USERNAME}" password="${env.DB_PASSWORD}">
```

変数についてまとめると、以下のような感じです。

|変数|指定方法|取得先|
|:--|:--|:--|
|DBサーバー名|env.DB_SERVERNAME|環境変数 DB_SERVERNAME|
|DBポート番号|env.DB_PORT|環境変数 DB_PORT|
|DB名|env.DB_DBNAME|環境変数 DB_DBNAME|
|DBユーザー名|env.DB_USERNAME|環境変数 DB_USERNAME|
|DBユーザーのパスワード|env.DB_PASSWORD|環境変数 DB_PASSWORD|
|JDBC ドライバーパス|DB2_JCC_DRIVER_PATH|server.env ファイルの DB2_JCC_DRIVER_PATH|
|JNDI名|jdbc/sample (ハードコード)| - (変数化し忘れ)|

##server.env

今回、server.env ファイルは JDBC ドライバのパスを指定しているだけです。
他にも同じようなやり方で情報を渡すことが可能です。
変更が多そうなものは環境変数として kubernetes から渡し、イメージとして変更する必要が無いものは server.env で指定すればよいでしょう。

```console:server.env
DB2_JCC_DRIVER_PATH=/config/jdbc/
```

これで DockerFile 以外の物の配置は完了したことになります。

#Dockerfile

次に、 Dockerfile と `docker build` コマンドでイメージを作成します。
まず、 Dockerfile の内容を確認しましょう。 この Dockerfile の基本は、 Docker Hub 上の 
WebSphere-Liberty イメージの説明ページに記載されています。

FROM : 先に pull したイメージを指定します。
LABEL maintainer : 作った人のメールアドレスを指定します。（なければ無いで構いません)

ADD :　ディレクトリや圧縮ファイル等を指定の場所に追加します。　ここでは `./files` 以下を `/config` 以下に追加しています。また、あわせてオーナーを 1001 に変更しています（1001 は WebSphere-Liberty ベースイメージで指定されています）
COPY : LibertyCounter.war ファイルを /config/dropins にコピーし、オーナーを変更しています。

※WebSphere-Liberty では、 (設定次第ではありますが) dropins にアプリケーションを入れれば展開・デプロイされます。

configure.sh :  これは WebSphere-Liberty イメージに付属のもので、最終的に必要となる WebSphere-Liberty のモジュール等をダウンロードし、起動させるスクリプトです。

```console:Dockerfile
FROM docker.io/websphere-liberty:kernel
LABEL maintainer "shimauma@example.com"

ADD     --chown=1001:0 ./files /config
COPY    --chown=1001:0 ./war/LibertyCounter.war /config/dropins
RUN     configure.sh
```

Dockerfile の詳細は割愛します。（Web に多くの情報があると思います)

Dockerfile 作成後、それをビルドしてイメージを作成します。
`-t` で イメージ名とタグを指定しています。 "." はカレントディレクトリの Dockerfile をビルドする指定です。

```console:ビルド
# ls
Dockerfile  files  war

# docker build -t liberty-counter:v3.0 .

Sending build context to Docker daemon  3.879MB
Step 1/5 : FROM docker.io/websphere-liberty:kernel
 ---> 878137168ed8
Step 2/5 : LABEL maintainer "shimauma@example.com"
 ---> Running in 1b88bab5c511
Removing intermediate container 1b88bab5c511
 ---> c4d48a0967a9
Step 3/5 : ADD  --chown=1001:0 ./files /config
 ---> 524464dc8c9f
Step 4/5 : COPY --chown=1001:0 ./war/LibertyCounter.war /config/dropins
 ---> be9224862fcf
Step 5/5 : RUN  configure.sh
 ---> Running in 8072633d8513
Removing intermediate container 8072633d8513
 ---> 11424458a589
Successfully built 11424458a589
Successfully tagged liberty-counter:v3.0
```

これでビルド完了です。

```console
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
liberty-counter     v3.0                11424458a589        48 seconds ago      459MB
websphere-liberty   kernel              878137168ed8        5 days ago          311MB
```

#IBM Cloud container registry への登録

作成したイメージを IBM Cloud container registry へ登録します。
具体的には、 イメージ名に IBM Cloud container registry を付与し、push する、という流れになります。

まず、[第2回で説明した手順](https://qiita.com/shimauma_Zzzzz/items/99d71965dad142f93e5b#ibm-cloud-%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)で、IBM Cloud にログインします。（手順省略）
次に、[第4回で説明した手順](https://qiita.com/shimauma_Zzzzz/items/97480242c969ddd0f9cd#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E7%99%BB%E9%8C%B2%E5%89%8A%E9%99%A4) で、イメージを登録します。

イメージ登録は以下のように行います。
まず、tag を付けます。

```console
# docker tag liberty-counter:v3.0 jp.icr.io/shimauma_zzzzz/default/liberty-counter:v3.0

# docker images
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
jp.icr.io/shimauma_zzzzz/default/liberty-counter   v3.0                11424458a589        17 minutes ago      459MB
liberty-counter                                    v3.0                11424458a589        17 minutes ago      459MB
websphere-liberty                                  kernel              878137168ed8        5 days ago          311MB

```

次に push します。

```console
# docker push jp.icr.io/shimauma_zzzzz/default/liberty-counter:v3.0
The push refers to repository [jp.icr.io/shimauma_zzzzz/default/liberty-counter]
438065068251: Pushed
3bf39480c5d8: Pushed
055ed22e3425: Pushed
bfd7e29956e1: Pushed
dda1b0da9873: Pushed
73bca3f685ab: Pushed
045898917c82: Pushed
ea2e902881eb: Pushed
96471ed8874f: Pushed
39f28991b87f: Pushed
e243b6bd9c42: Pushed
8553a689df1b: Pushed
a2d674c9d7ed: Pushed
4ad5df11bd98: Pushed
6effd95c47f2: Pushed
v3.0: digest: sha256:9ea8239c910e2eb7b490822b1463fd9f624442d65a5ea06f4e3cbc89e10c286e size: 3462
```

IBM Cloud Container Registry 上にイメージがあることを確認します。

```console
# ibmcloud cr images
イメージをリストしています...

リポジトリー                                       タグ   ダイジェスト   名前空間         作成日           サイズ   セキュリティー状況 
jp.icr.io/shimauma_zzzzz/default/liberty-counter   v3.0   a5d5a57c1570   shimauma_zzzzz   20 minutes ago   276 MB   1 件の問題

OK

```

セキュリティ状況に1件の問題が出ていますね。　
ここでは対応は割愛しますが、内容についてはコンソールで確認することが可能です。

![63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/7b082902-030b-8d7d-b62c-2c12894564c0.png)

![64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/cddd7ea6-f373-2b33-e080-eb67277b6eae.png)

2020/09/23) 追記
上記の脆弱性がやっぱり気になりましたので、対応しました。
こちらをご覧ください　→　[番外編.コンテナイメージのUpdate](https://qiita.com/shimauma_Zzzzz/items/5ba830350c6c976f12b5)

---
お疲れ様でした。
今回はここまでとし、次回は [8.IKS へのコンテナのデプロイ] を実施します。

←：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（6.DBアクセスアプリケーションの準備 (java)）](https://qiita.com/shimauma_Zzzzz/items/ced44370c6d3d47c8db6)
↑：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（1.概要）](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)
→：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（8.IKS へのコンテナのデプロイ）](https://qiita.com/shimauma_Zzzzz/items/7d586dd70341bbe6881c)

---