YellowfinをDockerコンテナで動かす最速の手順

[Yellowfin](https://yellowfin.co.jp/) が Dockerに正式対応してから2年近くが経過し、実際に本番環境で採用される事例も非常に多くなってきました。
本記事では、興味はあるんだけど情報が少なくて……という方向けに、DockerでYellowfinを動かす手順を解説します。
なお、Yellowfinのオンラインマニュアルに[詳細なインストール手順の記事](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=22708237)があるので、正確なところはそちらをご確認ください。ここではあくまでわかりやすく簡潔に記述していきます。

# 事前準備
なにはともあれ Dockerをインストールしなくてはなりません。具体的には以下の2つが必要です。

* Docker Engine
* Docker Compose

WindowsまたはMacにインストールするのであれば、[Docker Desktop](https://www.docker.com/products/docker-desktop/)を利用するのが最も簡単です。
Docker DesktopにはEngineとComposeの両方が含まれているので、個別にインストールする必要がありません。

# 使用する Yellowfinイメージの選択
公式に配布されているイメージには以下の2種類があります。

* Yellowfin オールインワンイメージ（yellowfin-all-in-one）
* Yellowfin アプリケーション限定イメージ（yellowfin-app-only）

前者のオールインワンイメージには、Yellowfinのアプリケーションとリポジトリデータベース（組み込みの PostgreSQL）の両方が含まれています。
オールインワンイメージはデモやPOC、サンドボックス等の簡易な用途を想定しており、本番環境やクラスタ環境での使用は推奨されていませんのでご注意ください。

後者のアプリケーション限定イメージは、Yellowfinのアプリケーションしか含まれていませんので、リポジトリデータベースを別途用意する必要があります。

上記のイメージは [YellowfinのDocker Hub](https://hub.docker.com/u/yellowfinbi) で公開されています。後述の手順でもここからダウンロードしたものを使用します。
もし独自のイメージをビルドしたい場合は、[YellowfinのGitHub](https://github.com/YellowfinBI/Docker) で公開されている情報を参考にしてください。

# オールインワンイメージの場合
## イメージの取得
Docker Hubからオールインワンイメージ（yellowfin-all-in-one）をpullします。
最新バージョンのYellowfinイメージを取得したい場合は以下のコマンドをシェル（Windowsならコマンドプロンプト、Macならターミナル）で実行します。

```
$ docker pull yellowfinbi/yellowfin-all-in-one:latest
```

特定のバージョン（例えば9.7.1.1）を取得したい場合は以下のようにします。

```
$ docker pull yellowfinbi/yellowfin-all-in-one:9.7.1.1
```

## docker-compose.ymlの作成

どこか任意のディレクトリに、以下のような内容のdocker-compose.ymlファイルを作成します。

```docker-compose.yml
version: '3'
services:
  yellowfin:
   ports:
      - "18080:8080"
   environment:
      - APP_MEMORY=4096
   image: "yellowfinbi/yellowfin-all-in-one:9.7.1.1"
   container_name: yf-all-in-one
```

|項目  |説明  |例  |
|---|---|---|
|version  |docker-composeで使用するバージョン。執筆時点（2022年5月24日）では'3'にしておけばOK。  |'3'  |
|service  |アプリケーションを動かすための各要素（？）。任意の名称でOK。 |yellowfin  |
|ports  |ホスト側ポート：コンテナ側ポートを指定する。  |"18080:8080"  |
|image  |使用するイメージ。前述のpullしたものを指定する。  |"yellowfinbi/yellowfin-all-in-one:9.7.1.1"  |
|container_name  |コンテナの名前を指定する。  |yf-all-in-one  |

また、オールインワンイメージではenvironmentの変数として以下を設定することができます。
|項目  |説明  |例  |
|---|---|---|
|APP_MEMORY  |Yellowfinに割り当てるメモリのメガバイト数を指定する。  |4096  |

## Yellowfinコンテナの起動
docker-compose.ymlを保存したディレクトリに移動して、以下のコマンドを実行します。

```
$ docker compose up -d
```

その後、上記の例であれば http://localhost:18080 にアクセスすると、ログイン画面が表示されますので、初期の管理者IDとパスワードでログインしてください。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/facabaa9-c27b-654e-968a-1c1bb470a421.png)

初回起動時はまだライセンスが適用されていない状態ですので、適切なライセンスファイルをアップロードしてください。
![license.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/d46ad2af-8ba8-b245-6147-777b1af9a626.png)

ライセンスを適用すれば、ごく普通に使用できる状態になります。
![dash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/65db3515-f38e-056d-39d1-98f10df0bba5.png)

## Yellowfinコンテナの停止
Yellowfinを停止する際は以下のコマンドを実行します。

```
$ docker stop コンテナの名前
```

今回の例（コンテナ名がyf-all-in-one）であれば、以下のコマンドでYellowfinコンテナを停止できます。
```
$ docker stop yf-all-in-one
```

なお、コンテナを停止してもYellowfinのアプリケーションやリポジトリのデータは失われません。再度コンテナを起動すれば、以前のデータから続けて使用することができます。

コンテナそのものが不要になった場合は、後述のコンテナの削除を行ってください。

# アプリケーション限定イメージの場合
## リポジトリデータベースの準備
まずはリポジトリデータベースを準備する必要があります。
PostgreSQL、MySQL、Oracle、SQL Serverなどが利用可能ですが、今回はPostgreSQLが既に準備されているという前提で進めます。

## Yellowfinインストーラの実行
リポジトリデータベースに必要なデータを作成するために、Yellowfinの新規インストーラを実行します。

用意したデータベースにテーブルとレコードを作成するのが目的なので、それに対応したスクリプトがあれば事足りるところなのですが、あいにくそういったものは提供されていません。
そのため、ひとまずYellowfinのインストールを実行することによって、リポジトリデータベースのテーブルとレコードを作成します。
なお、このインストールで作成されるアプリケーションのフォルダ一式が実際に使われることはないので、後ほど削除してしまって問題ありません。

データベース情報の入力画面では、リポジトリデータベースの情報を入力してください。
![inst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/1407667b-d87e-1dac-e5cf-e180c8a89d1e.png)

## web.xmlからリポジトリ情報の取得
Yellowinのインストールが完了したら、 `Yellowfinのインストールディレクトリ/appserver/webapps/ROOT/WEB-INF`にある web.xmlから以下の部分を探して、手元に控えておいてください。

```web.xml
    <init-param>
      <param-name>JDBCDriverClass</param-name>
      <param-value>org.postgresql.Driver</param-value>
    </init-param>
    <init-param>
      <param-name>JDBCUrl</param-name>
      <param-value>jdbc:postgresql://localhost:5432/yellowfin</param-value>
    </init-param>
    <init-param>
      <param-name>JDBCUser</param-name>
      <param-value>postgres</param-value>
    </init-param>
    <!-- 
      Password to the configuration database connection is encrypted at
      installation time. If you need to change this password, you can set
      the JDBCPasswordEncrypted parameter to false, and store the password
      in plaintext in the JDBCPassword parameter.
    -->
    <init-param>
      <param-name>JDBCPassword</param-name>
      <param-value>暗号化されたパスワードの文字列</param-value>
    </init-param>
    <init-param>
      <param-name>JDBCPasswordEncrypted</param-name>
      <param-value>true</param-value>
    </init-param>
```

## イメージの取得
Docker Hubからアプリケーション限定イメージ（yellowfin-app-only）をpullします。
ただし、リポジトリデータベースとのバージョンの整合性に注意する必要がありますので、latestではなくバージョンを明確に指定することをお勧めします。

```
$ docker pull yellowfinbi/yellowfin-app-only:9.7.1.1
```

## docker-compose.ymlの作成

どこか任意のディレクトリに、以下のような内容のdocker-compose.ymlファイルを作成します。

```docker-compose.yml
version: '3'
services:
  yellowfin:
   ports:
      - "18080:8080"
   environment:
      - JDBC_CLASS_NAME=org.postgresql.Driver
      - JDBC_CONN_URL=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/yellowfin
      - JDBC_CONN_USER=postgres
      - JDBC_CONN_PASS=暗号化されたパスワードの文字列
      - JDBC_CONN_ENCRYPTED=true
      - APP_MEMORY=4096
   image: "yellowfinbi/yellowfin-app-only:9.7.1.1"
   container_name: yf-app-only
```

オールインワンイメージで触れた部分は省略しますが、それ以外にenvironmentの変数としてリポジトリの接続情報を記述する必要があります。
|項目  |web.xmlとの対応  |例  |
|---|---|---|
|JDBC_CLASS_NAME  |JDBCDriverClass  |org.postgresql.Driver  |
|JDBC_CONN_URL  |JDBCUrl  |jdbc:postgresql://192.168.1.1:5432/yellowfin **※PostgreSQLの場合、localhost指定ではうまくいかずIPアドレスにする必要がある**  |
|JDBC_CONN_USER  |JDBCUser |postgres  |
|JDBC_CONN_PASS  |JDBCPassword  |  |
|JDBC_CONN_ENCRYPTED  |JDBCPasswordEncrypted  |true  |

アプリケーション限定イメージでは、上記以外にもenvironmentの変数が存在します。詳細は[オンラインマニュアル](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=22708237)を参照してください。

## Yellowfinコンテナの起動
docker-compose.ymlを保存したディレクトリに移動して、以下のコマンドを実行します。

```
$ docker compose up -d
```

その後、今回の例であれば http://localhost:18080 にアクセスすると、ログイン画面が表示されます。

## Yellowfinコンテナの停止

今回の例（コンテナ名がyf-app-only）であれば、以下のコマンドでYellowfinコンテナを停止できます。
```
$ docker stop yf-app-only
```

# コンテナ一覧の表示や、コンテナの削除をするには
コンテナの一覧は以下のコマンドで表示できます。

```
$docker ps -a
```

不要になったコンテナを削除するには、以下のコマンドを実行します。

```
docker rm コンテナIDまたはコンテナ名
```