YellowfinをEC2でDockerのインストールから始めてコンテナで動作させるまで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/a8415747-d1e5-2303-91ea-8be9125b6cf6.png)

#まずはじめに
アプリのコンテナ化が流行りということもあってか、YellowfinもDocker、Kubernetesで動かせるようになったようなので何もないところからDockerで動かすところまでを記事にしたいと思います。これがあるとほんとに短期間のPOC(All-in-oneパッケージ)やサンドボックス、中長期のPOC(App-only-image)でもすぐできてしまうところがありがたいです。
dockerファイルなどはこちらに用意されています。
https://github.com/YellowfinBI/Docker
https://hub.docker.com/u/yellowfinbi

そしてここではAWSのEC2上で起動する場合を想定して説明していきます。

##事前準備
dockerのインストールの前にサーバーの設定を行います。
大まかに言えば、まず最新化して言語設定・タイムゾーン設定を日本のものに合わせて、dstatでサーバーリソースを見れるようにします。

```
sudo yum update
sudo localectl set-locale LANG=ja_JP.UTF-8
sudo timedatectl set-timezone Asia/Tokyo
sudo yum install dstat
```

#dockerのインストール
yumでdockerをインストールし、サービススタート、サーバー起動時サービス自動スタートの設定を行います。
4行目のusermodはユーザをdockerグループに追加すると，sudoなしでdockerコマンドを実行できるらしいので追加します。
再起動後、ユーザーでversion確認して無事にコマンドを叩けるかテストします。

```
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
sudo reboot //適用するために再起動
docker --version
```
これでdocker自体のインストールは完了です。

#docker-composeのインストール
docker-composeは、Dockerビルドやコンテナ起動のオプションなどを含め、複数のコンテナの定義をymlファイルに書き、それを利用してDockerビルドやコンテナ起動をすることができます。一つの簡単なコマンドで複数のコンテナを管理できるようになります。
Yellowfinの設定もymlファイルで書かれているのでこれをインストールします。

↓でdocker-composeの最新のバージョンを覚えてください。
https://github.com/docker/compose/releases
コマンドで打つ時は1.27.4の部分を確認したバージョンに置き換えてください
2行目で実行権限を付与しています。

```
sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

#DockerでYellowfinを動かす
ここから2通りのパターンでYellowfinを起動します。
1パターン目のAll-in-oneパッケージははpostgreSQLも含めてYellowfinが構成されるのでちょっと試すくらいであればこちらで大丈夫です。でもDBと同居しているのでサービスを落とした瞬間にデータが全て失われます。。
2パターン目のApp-only-imageはYellowfinのリポジトリを外部ですでに作成しておき、Yellowfinのアプリだけをコンテナ化する方法です。そのため、このサービスを落としてもデータはDBに持っているためサービスを上げ直せばまた続けて作業することができます。ただアプリとリポジトリDBのバージョンを合わせないといけないことだけ注意が必要です。Yellowfin9.3.1のときはリポジトリDBも9.3.1の構成になっている必要があります。

##YellowfinをAll-in-oneパッケージで動かす
このコマンドでイメージを取得します。

```
docker pull yellowfinbi/yellowfin-all-in-one:latest
```
https://github.com/YellowfinBI/Docker/blob/master/Docker%20Files/yellowfinAllInOne/Dockerfile
ここから設定ファイルをダウンロードし、名前をdocker-compose.ymlにして保存します。
保存したディレクトリで下記のコマンドを打てば立ち上がります。

```
[ec2-user@ip-172-31-4-99 all-in-one]$ docker-compose up -d
Creating all-in-one_yellowfin-all-in-one_1 ... done
```
その後、xxx.xxx.xxx.xxx:8080にアクセスするとYellowfinのログインページが開かれます。





##YellowfinをApp-only-imageで動かす
この方法は事前にこれから動かすバージョンで作成・更新されたリポジトリDBがあらかじめ必要です。そのため、いちから作るにはまずYellowfinのフルバージョンをインストールすることで、リポジトリDBを作成しておき初回起動までは済ませておく必要があります。
最初からの作成の場合はこちらをご覧ください。[EC2にYellowfinのベストなテスト環境を構築するまでのメモ](https://qiita.com/hadatuna/items/d0782d78498f535b08ca)


それでは手順ですが、まず、https://portal.yellowfinbi.com/yf_latestbuild.jsp からリンクをコピーし最新ビルドのフルバージョンをダウンロードします。

```
wget https://files.yellowfin.bi/downloads/9.3/yellowfin-9.3.1-20201022-full.jar
```
その後このファイル名をymlで読み込めるように変更します。

```
mv yellowfin-9.3.1-20201022-full.jar yellowfin-installer.jar
```
ここからDockerfileとperform_docker_configuration.shを同じディレクトリにダウンロードします。
https://github.com/YellowfinBI/Docker/tree/master/Docker%20Files/yellowfinAppOnly

シェルファイルに実行権限を与えます。

```
sudo chmod 764 perform_docker_configuration.sh
```
イメージを作成します。

```
docker build . -t yellowfin-app-only
```
すると、Dockerfileを読み込み、コマンドが実行されていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/a932bbb7-0125-3263-35fe-e3364d988d11.png)


リポジトリ情報を書き換えてコマンド実行してください。

```
sudo docker run -d -p 80:8080 \
-e JDBC_CLASS_NAME=org.postgresql.Driver \
-e JDBC_CONN_URL=jdbc:postgresql://dbhost:5432/yellowfinDatabase \
-e JDBC_CONN_USER=dbuser \
-e JDBC_CONN_PASS=dbpassword \
yellowfin-app-only:latest
```
この場合80番ポートにルーティングしているので、xxx.xxx.xxx.xxxにアクセスするとYellowfinのログインページが表示されます。
この時のコンテナの状態はこちら。All-in-oneパッケージは落として、App-only-imageのコンテナだけ上がっているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/1b2fc0df-97f8-36e3-d662-4bcccc7fd8fb.png)


##役に立ったコマンド
```
//イメージのダウンロード
docker pull [オプション] イメージ名[:タグ名]
//ローカル環境のDockerイメージの一覧表示
docker images
//コンテナのバックグラウンド実行
docker run -d イメージ名[:タグ名] [引数]
//すべてのコンテナを表示する
docker ps -a
//コンテナの起動
docker start コンテナID
//コンテナを停止
docker stop コンテナID
//コンテナを削除
docker rm コンテナID

```

#ということで
これを構築しておくとすぐにサンドボックスを作成できたり、DBと分離したサービスとして立ち上げられたりするのでより手離れがいい感じに環境が作成できます。慣れないとコマンドが難しかったりしましたがなんだか使ってるうちにわかってきた気がします。
正式なドキュメントはYellowfin Japanにお問い合わせすればホワイトペーパーがもらえると思うので聞いてみてください。
Dockerでのクラスター化や、Kubernetesでの構築についてはいつか時間ができた時にチャレンジしたいと思います。



#参考にさせていただきました。
[dockerとdocker-composeのインストール(Linux編)](https://qiita.com/youtangai/items/ff67ceff5497a0e0b1af)
[Docker入門（第六回）〜Docker Compose〜](https://knowledge.sakura.ad.jp/16862/)
[Dockerコマンド一覧](https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2)