DockerでJIRA上げてみました。


## はじめに

ひきつづきDockerのお勉強中。
簡単なshellを起動させて、動作を確認するところで止まってしまったので、できればアプリケーションを起動してみるところまでは試してみたい！

そこで、index.docker.io を眺めていて目にとまったものを試してみることにしました。

今回は、atlassian/jira というイメージがあったので、これに注目。
普段Remdine使いなのですが、『簡単に起動できるなら…!』と思って、試すことにしました。

※ 追記：末尾に、うまくいかない場合の対応方法を掲載しました。

## やりたいこと／やらないこと

やりたいこと

* index.docker.io から atlassian/jira のイメージを取ってきて、追加する。
* dockerで上記イメージを起動させる。
* 起動したJIRAに、外部からアクセスをして、Webアプリケーションの設定を進めてみる。

やらないこと／省略すること

* JIRAを1からセットアップすること。
 * Chefその他のプロビジョニングのスクリプトは自作しない。
 * まずは提供されているイメージを使い、ちゃんと起動するか＆起動後に、このイメージがどうやって作られているかを紐解く方をメインとする。

## イメージの取得/登録

* https://index.docker.io/u/atlassian/jira/

Dockerfileも一緒に掲載されているので、どんなステップでインストールしているか良く分かります。
細かい構築の手順を、もっと深堀したい方は、『参考サイト／関連サイト』をどうぞ。

### 起動スクリプトを実行

以下、VagrantのDocker起動用ubuntuでの作業になります。

* 前提：VagrantのOSは、private networkでIPを割り当てている。
 * 今回、192.168.33.15のIPを割り当て。

イメージの取得についてですが **ネットワークの状況などにより、うまく行かないこともありました**ので、ご注意。

```source:bash
#イメージを取得
vagrant@precise64:~$ docker -D pull atlassian/jira  

# 8080番ポートをdocker側の80番に割り当て
vagrant@precise64:~/work$ docker run -d -p 80:8080 atlassian/jira /init.sh -D
```

* -pオプションで、dockerのコンテナの8080番を、dockerのホストになっているUbuntuの80番にマップさせています。（dockerのホスト側ポート:コンテナ側のポート、の順です）
* それをUbuntuをVagrantでホストしているMacOS側から参照できるようにしています。

※ -pオプションでホスト側のポートの指定をしない場合は、動的にポートが割り当てになります。この場合は、何番に割当たったのか docker ps で確認できます。

## 起動時の画面

### 起動スクリプト実行直後

以下が、起動後に、MacOS側のブラウザで参照したところです。
左側は、attachしてJIRAの起動のメッセージを表示させたターミナルです。

※ MacOS側で表示したURLは192.168.33.15:49157 になっています。こちらは -pで固定ポートにマップさせなかった場合の例です。-p 80:8080 にした場合は、192.168.33.15:80 でアクセスできます。

デバッグモードで起動しているので、Tomcatのコンソールログも眺めることができます。

![docker-jira.png](https://qiita-image-store.s3.amazonaws.com/0/27976/a3a13099-be1d-e3db-3035-6ea8847181d4.png "docker-jira.png")

このあと、データベースの指定をします。

* 『組み込み』(Built in)の場合は、デモ用でオンメモリのDBを使うようです。
* My Own Databaseの場合は、dockerのイメージで一緒に追加されたPostgreSQLを指定します。
 * アカウント、パスワードは [dockerのページ](https://index.docker.io/u/atlassian/jira/)に記載してあるものを使いましたが、ユーザ名／DBともpostgres で接続テストが通りました。

![docker-jira-db.png](https://qiita-image-store.s3.amazonaws.com/0/27976/40b376c6-49f5-6411-1eae-bb22ab66cd5b.png "docker-jira-db.png")



### ライセンスを取得とセットアップ完了後

次に、セットアップを進めて、利用可能になった段階の画面です。

上記の起動画面のあと、DBへの接続設定や、Atlassianに接続してのライセンスのアクティベーションなどの処理が走ります。（JIRAのライセンス確認の画面が出て、『MyAtlassianのアカウントが無ければ作ってね！』のメッセージも表示されます）

幸いホストOSを介して、Dockerのコンテナ内のJIRA稼働環境も、インターネットに出て行けるため、裏側でアクティベーションが実行されて、使えるようになりました。

![docker-jira-avtivate.png](https://qiita-image-store.s3.amazonaws.com/0/27976/83264649-6984-91c5-cc89-420f9f8b3c55.png "docker-jira-avtivate.png")

※ こちらも、URLは192.168.33.15:49164 になっていますが、-p 80:8080 にした場合は、同様に192.168.33.15:80 でアクセスできます。

atlassian/jira のイメージで仕上がっているのは、セットアップ開始直前までです。
ライセンスをアクティベートして、セットアップが終わったら、コンテナの状態をコミットして置きましょう！
（忘れてしまうと、都度ライセンス設定しないといけません）

### attachしてTomcatのログを確認

起動したコンテナのプロセスにattachする場合は、下記の通り。

```
# docker ps でCONTAINER IDを調べます
vagrant@precise64:~$ docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                            NAMES
6cfaae1e3fe1        atlassian/jira:latest   /init.sh -D         8 seconds ago       Up 7 seconds        0.0.0.0:80->8080/tcp, 5432/tcp   suspicious_pike 

# 上記で得られたCONTAINER IDを指定してattachします
vagrant@precise64:~$ docker attach -sig-proxy=false 6cfaae1e3fe1

# うまく行くと、Web側の画面の遷移させるたびに、tomcatのログが流れます  
Feb 23, 2014 2:58:56 AM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.  
……

```

* -sig-proxy=false を指定すると、起動しているコンテナを停止せずに、Ctrl-Cでデタッチできます。


## 確認／イメージはどうやって作られたの？

上記の処理は、index.docker.io から取得し、JIRA起動用のスクリプトを実行しただけになります。

ちなみに、このイメージですが、ベースのUbuntuにChefをインストールし、そこからChefやスクリプトを併用して、Postgresql, java, tomocat, JIRAのセットアップを行っています。

また、dockerのため、途中のステップ（たとえばPostgreSQLをインストールした時点）まで戻る事ができます。docker historyを眺めると、その行程が見えてきます。

凄いですね…。

## 今回のまとめ

細かくは追いかけていませんが、

* 起動したJIRAに、外部からアクセスをして、Webアプリケーションの設定を進めてみる。

が出来ることは分かりました。
環境がすぐに作れる／再現できるので、たとえばAPIを使ったプログラムのテスト時に起動させる、なんていうのにとても便利そうです。

## 補足：環境について

* 作業マシン：MacOS / VirtualBox & Vagrant
* Dockerのホスト用の環境
 * https://github.com/dotcloud/docker を利用。
 * vagrant up で、dockerがインストールされたUbuntuをベースにした。

MacOS側からアクセスしやすいように、下記のように192.168.33.15 というIPを割り当てています。

```Vagrantfileの抜粋
Vagrant::Config.run do |config|
  # Setup virtual machine box. This VM configuration code is always executed.
  config.vm.box = BOX_NAME
  config.vm.box_url = BOX_URI
 
  #ここでprivate ip割り当てをしています。:hodtonly で指定。
  #config.vm.network "private_network", ip: "192.168.33.15"
  config.vm.network :hostonly, "192.168.33.15"

  # Use the specified private key path if it is specified and not empty.
  if SSH_PRIVKEY_PATH
      config.ssh.private_key_path = SSH_PRIVKEY_PATH
  end

  config.ssh.forward_agent = true
end

``` 


## 補足：参考サイト／関連サイト

* [Dockerでjavaアプリをデプロイする。すごい！](http://japan.blogs.atlassian.com/2013/12/deploy-java-apps-with-docker-awesome/) (Atlassian Blog / 日本語訳)
* [Deploy Java Apps With Docker = Awesome](http://blogs.atlassian.com/2013/06/deploy-java-apps-with-docker-awesome/) 上記のオリジナル記事

* [Docker all the things at Atlassian: automation and wiring](http://blogs.atlassian.com/2013/11/docker-all-the-things-at-atlassian-automation-and-wiring/) (Atlassian Blog)
 * 今回利用したイメージのベースになる手順が記載されています。
 * インストールスクリプトを使ってコマンド1つで構築する方法と、PostgreSQLのセットアップから順番にdockerのコマンドを実施、commitしていく方法が併記されています。

## 追記：うまく起動しない/エラーが出る場合

セットアップが終わったあとにコミットし、その後再度 docker runコマンドで起動したら、エラーになったりしましたので、追記しておきます。

### プラグインのエラーが出てしまった場合

* setenv.sh に、以下を追加
 * -Datlassian.plugins.enable.wait=300 
 * Ref. [The Gadget Dashboard bundled plugin is not available Error When Accesing JIRA](https://confluence.atlassian.com/display/JIRAKB/The+Gadget+Dashboard+bundled+plugin+is+not+available+Error+When+Accesing+JIRA)

### init.shが終了してしまう場合

* rm -fr /opt/atlassian/jira/work/catalina.pid
* rm -rf /opt/atlassian/jira-home/.jira-home.lock
* rm -rf /opt/atlassian/jira-home/.osgi-plugins
 * Ref. [Troubleshooting JIRA Startup Failed Error](https://confluence.atlassian.com/display/JIRAKB/Troubleshooting+JIRA+Startup+Failed+Error)