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(今回は不要)

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 します。

$ 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 ビルドします。

$ cd ci.docker/releases/latest/kernel
$ cp -p Dockerfile.ubuntu.adoptopenjdk8 Dockerfile
$ vi Dockerfile # 2箇所に修正をする
$ docker build -t openliberty/raspberrypi .

Docker イメージが作成できていることを確認します。感動。

$ 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 を利用してみます。

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

$ sudo apt install maven
$ mvn --version
Apache Maven 3.6.0

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

$ 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 等で強制的にアプリを停止しておきます。

$ curl http://localhost:9080

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

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 が準備できたので、ビルドをします。

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

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

$ 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
GithubリポジトリからOpen Liberty のDocker イメージの作成及びサンプルアプリの実行までが記述されている。

Open Liberty Images
Open Libertyのソースコードのリポジトリ