TomcatからはじめるコンテナとOpenShift (その2)

TomcatからはじめるコンテナとOpenShiftということで、ゆっくり投稿しています。
この記事では、Red HatのtomcatであるJBoss Web Server(略して、JWS)のコンテナの設定周りを見ていきます。
JWSの設定は、ほとんどTomcatと同じですが、コンテナを意識した設定がされている箇所があり、
それについてメインで記載します。

前回の投稿

https://qiita.com/takashyan/items/eb5becb43bac80ce8144

## 環境
OpenShiftは使わずに、dockerでコンテナの取得や実行を行います。

## JWSコンテナイメージの取得

まずは、JWSのコンテナイメージを取得します。
JWSのコンテナイメージは、Red Hat Ecosystem Catalogのページに取得方法が記載されています。
今回は、JBoss Web Server 5.6 (OpenJDK8) on UBI 8(*1)を取得します。
 *1：tomcat9系(OpenJDK8) on RHEL8のUBI イメージ

JWSのコンテナイメージの取得には、　レジストリサービスのアカウントが必要となります。
下記のサイトにて、　レジストリサービスのアカウントを作成してください。

https://access.redhat.com/terms-based-registry/

　レジストリサービスのアカウント情報を使って、registry.redhat.ioにログインします。

```sh
$ docker login registry.redhat.io
Username: {レジストリサービスのアカウントのユーザ名}
Password: {レジストリサービスのアカウントのパスワード}
Login Succeeded!
```
ログインに成功したら、JWSのコンテナイメージを取得します。

```sh
$ docker pull registry.redhat.io/jboss-webserver-5/jws56-openjdk8-openshift-rhel8:5.6.1-8
5.6.1-8: Pulling from jboss-webserver-5/jws56-openjdk8-openshift-rhel8
4eef1fa1f1c1: Pull complete 
eb24191cef20: Pull complete 
f5b37c0f4e73: Pull complete 
f4df78420fc7: Pull complete 
Digest: sha256:39cb348949f71b7b832e172cad2be1d7b2d899710375656603bcc3dedcde4b9c
Status: Downloaded newer image for registry.redhat.io/jboss-webserver-5/jws56-openjdk8-openshift-rhel8:5.6.1-8
```

イメージの情報を見ておきます。

```sh
$ docker images
REPOSITORY                                                            TAG       IMAGE ID       CREATED        SIZE
registry.redhat.io/jboss-webserver-5/jws56-openjdk8-openshift-rhel8   5.6.1-8   cbca614e1587   3 weeks ago    541MB
```
## JWSコンテナを動かす

動かしてみます。レポジトリの文字列が長いので、レポジトリ:タグではなくて、イメージIDを指定してます。

```sh
$ docker run -it -p 8080:8080 cbca614e1587
-XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError
INFO Access log is disabled, ignoring configuration.
-XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError
/opt/jws-5.6/tomcat/bin/launch/catalina.sh: line 12: /opt/jboss/container/prometheus/jws-prometheus-opts: No such file or directory
-XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError
INFO Running jboss-webserver-5/jws56-openjdk8-rhel8-openshift image, version 5.6.1
Using CATALINA_BASE:   /opt/jws-5.6/tomcat
Using CATALINA_HOME:   /opt/jws-5.6/tomcat
Using CATALINA_TMPDIR: /opt/jws-5.6/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0
Using CLASSPATH:       /opt/jws-5.6/tomcat/bin/bootstrap.jar:/opt/jws-5.6/tomcat/bin/tomcat-juli.jar
<省略>
```

素のtomcatとはCATALINA_HOMEのパスなどが異なっています。
素のtomcatでは/usr/local/tomcatがデフォルトで、JWSでは/opt/jws-5.6/tomcatのようになっています。
基本的にrpmでインストールした場合と同じ考え方で、/optの下にあります。

また、Hello World用のwebアプリが入っていますので、ブラウザでhttp://localhost:8080/ にアクセスすると、HelloWorldがでます。

##  JWSコンテナの設定ファイル

前述したCATALINA_HOMEが/opt/jws-5.6/tomcatなので、
設定ファイルは、/opt/jws-5.6/tomcat/conf配下にあります。

```sh
$ ls /opt/jws-5.6/tomcat/conf
Catalina	 catalina.properties  jaspic-providers.xml  logging.properties	tomcat-users.xml  web.xml
catalina.policy  context.xml	      jaspic-providers.xsd  server.xml		tomcat-users.xsd
```


試しによく利用するserver.xmlを覗いてみます。
```sh
$ cat /opt/jws-5.6/tomcat/conf/server.xml
<省略>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/proc/self/fd"
           prefix="1" suffix="" rotatable="false" requestAttributesEnabled="true"
           pattern="%h %l %u %t %{X-Forwarded-Host}i &quot;%r&quot; %s %b" />
<省略>
```
上記は、アクセスログ部分になります。
出力先ディレクトリがdirectory="/proc/self/fd"　prefix="1"となっています。
なので、/proc/self/fd/1＝標準出力をアクセスログの出力先にしています。コンテナならではのところです。
ちなみに、素のTomcatコンテナは、/usr/local/tomcat/logsにアクセスログが出力されます。


##  JWSコンテナのアクセスログを有効にする

アクセスログは何かと必要になります。
JWSコンテナでは、デフォルトではアクセスログが無効になっています。

JWSコンテナを起動した際に、２行目に以下のメッセージが出ていました。
アクセスログが無効になっていることがわかります。
```sh
INFO Access log is disabled, ignoring configuration.
```
アクセスログを有効にするには、環境変数(ENABLE_ACCESS_LOG=true)を設定します。
これは、JBossも同じ設定方法となっています。
今回は、コンテナの起動時に環境変数を引数渡しでやってみます。

```sh
$ docker run -e ENABLE_ACCESS_LOG=true -it -p 8080:8080 cbca614e1587 
-XX:+UseParallelOldGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=100m -XX:+ExitOnOutOfMemoryError
INFO Configuring Access Log Valve.
<省略>
```
2行目にINFO Configuring Access Log Valve.が出てますので、有効になっています。

余談ですが、Access Log ValveのValveは、tomcatがHTTPリクエストを処理するパイプラインを持っており、tomcatはValveを追加することで、リクエストのログを出力したり、アクセスコントロールをしたりする仕組みを持っており、デザインパターンのChain of Responsibilityをうまいこと利用して実現してます。

アクセスログの出力先は、前述した通り標準出力になります。
```sh
26-Apr-2022 16:25:17.333 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [3311] milliseconds
172.17.0.1 - - [25/Apr/2022:10:25:19 +0000] - "GET / HTTP/1.1" 200 13
172.17.0.1 - - [25/Apr/2022:10:25:31 +0000] - "GET / HTTP/1.1" 200 13
```


##  終わりに
本記事では、JWSコンテナの設定周りについて記載しました。
JWSコンテナはtomcatとほぼ同じなのですが、アクセスログなどを含めコンテナに適した設定が反映されたりしています。