Raspberry Pi 上で Open Liberty を動かす



自宅で転がっている Raspberry Pi を利用して、Kubernatesクラスター上で継続的インテグレーション/継続的デリバリー(CI/CD)の学習をするための第一歩。

継続的ほにゃにゃらといいながら、まずJavaのWebアプリケーションを動かすために、Java EE(Java Enterprise Edition)の仕様を満足するアプリケーションサーバーを準備します。

Java EE仕様のアプリケーションサーバーは、重厚長大なイメージがあり、Raspberry Pi上で動作するのか? との疑問をもたられるかもしれませんが、Open Liberty という、Java EEの仕様を満足するアプリケーションサーバーがあり、軽快に動作します。

## 環境と前提条件
- Docker : version 19.03.8
- Raspberry PiのKubernatesクラスターが構築されていること(今回は不要)
- Kubernatesクラスター クライアント/サーバー v1.18.2/v1.18.2(今回は不要)

![k8s-compo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155323/f16db808-e975-e6e4-3091-53dad5908220.png)


## Open Liberty とは

Open Liberty は、製品版の Websphere Liberty のオープンソース版で、元々の Websphere Liberty の軽量・高速であること、モジュール化されていることなどの特徴を引き継いでいます。

##  Open Liberty の Docker イメージ作成
Docker Hubを参照すると、openliberty/open-liberty のタグ名でOpen Libertyが直ちに見つかります。しかし、x86、ppc64le、s390x アーキテクチャーのイメージしか提供されていないよ
うなので、Open Liberty の Docker イメージを作成することにします。

git が未導入な場合は、導入して、Open Libertyのソースのリポジトリを clone します。

```shell-session
$ sudo apt-get install git
$ mkdir -p ~/tmp/open-liberty
$ cd ~/tmp/open-liberty
$ git clone https://github.com/OpenLiberty/ci.docker.git
```

Dockerfile のテンプレートが準備されているので、openjdkを利用しているテンプレートをコ
ピーして必要ば部分を修正します。

修正箇所は2箇所
1. 参照するイメージをアーキテクチャーにあわせて修正する
「FROM adoptopenjdk:8-jre-openj9」 を 「FROM arm32v7/adoptopenjdk:latest」 に修正する。
2. $OPENJ9_SCC の行をコメントアウト
77行目付近の 「RUN if [ "$OPENJ9_SCC" ...」  から始まる行をコメントアウト

環境変数 $OPENJ9_SCC は、Javaクラスをキャッシュするための仕組みらしいのですが、
何が正解が、追求していません。(すみません。)

Docker ビルドします。

```shell-session
$ cd ci.docker/releases/latest/kernel
$ cp -p Dockerfile.ubuntu.adoptopenjdk8 Dockerfile
$ vi Dockerfile # 2箇所に修正をする
$ docker build -t openliberty/raspberrypi .
```
Docker イメージが作成できていることを確認します。感動。

```shell-session
$ docker image ls
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
openliberty/raspberrypi   latest              f7976fae19fd        12 minutes ago      561MB
```

## サンプルアプリのイメージ作成
作成した Open Liberty の Docker イメージをベースにして、サンプルアプリの Docker イメージを作成して、稼働を確認します。

JavaのWebサンプルアプリとして、様々な物が GitHUb 上に存在しますが、今回は Open Liberry 側で提供している。サンプルアプリ [sample-getting-started](https://github.com/OpenLiberty/sample-getting-started) を利用してみます。

Webのアプリケーションモジュールを作成するために、maven と呼ばれるビルドツールが必要なので、以下の手順で導入をしておきます。

```shell-session
$ sudo apt install maven
$ mvn --version
Apache Maven 3.6.0
```

作業ディレクトリに移動して、git から clone して、ビルドをします。(これも少し時間がかかる)
ビルド後に 自動的に Open Liberty で実行されるようになっています。

```shell-session
$ mkdir ~/tmp/sample-getting-started
$ cd  ~/tmp/sample-getting-started
$ git clone https://github.com/OpenLiberty/sample-getting-started 
$ mvn clean package liberty:run
```

アプリが稼働すると、http://localhost:9080 でリクエストを受けられる様になります。
curl でリクエストをして、それらしいレスポンスが戻ってくれば正常に稼働しています。(多分)
稼働が確認できたら、コントロール-C 等で強制的にアプリを停止しておきます。

```shell-session
$ curl http://localhost:9080
```

アプリの稼働が確認できたので、先ほど作成した Open Liberty の Docker イメージをベース
にして、サンプルアプリの Docker イメージを作成します。
maven のビルド実行により、warファイルは作成済みなので、Dockerfile で war をコピーします。

```dockerfile
FROM openliberty/raspberrypi

LABEL maintainer="Graham Charters" vendor="IBM" github="https://github.com/WASdev/ci.maven"

COPY --chown=1001:0 src/main/liberty/config/ /config/
COPY --chown=1001:0 target/*.war /config/apps/
```

Dockerfile が準備できたので、ビルドをします。

```shell-session
$ cd  ~/tmp/sample-getting-started
$ vi Dockerfile
$ docker build -t sample-getting-started/raspberrypi .
```

docker イメージを確認するとこのようになります。

```shell-session
$ docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
sample-getting-started/raspberrypi   latest              2943356c7ae1        10 seconds ago      561MB
openliberty/raspberrypi              latest              f7976fae19fd        36 minutes ago      561MB
arm32v7/adoptopenjdk                 latest              8db1eaed3a3f        6 days ago          381MB
  :
```

Docker イメージをコンテナ上で実行して、curl のリクエストにレスポンスがあるかを確認します。
```shell-session
$ docker run -d -p 9080:9080 sample-getting-started/raspberrypi
$ curl http://localhost:9080
```

## まとめ
本当は、アプリのDocker イメージを Pod化して、Kubernates クラスターにデプロイをする予定でしたが、Podでエラーが発生してしまったので、今日はここまで。

## 参考資料
[Open Liberty in Docker on a Raspberry Pi](https://openliberty.io/blog/2020/02/05/docker-open-liberty-raspberry-pi.html)
GithubリポジトリからOpen Liberty のDocker イメージの作成及びサンプルアプリの実行までが記述されている。

[Open Liberty Images](https://github.com/OpenLiberty/ci.docker)
Open Libertyのソースコードのリポジトリ