DockerでPlay Framework2.4.2を動かしてみた。

# まえがき
私の所属しているプロジェクトでは、仮想マシンのCentOS上でPlay FrameworkのWebアプリを稼働させています。
これを進化させたいが故に、今回、DockerでのPlay Framework環境構築をしました。

# 本題
では、作っていきましょう。
## ■dockerコンテナ内環境
| 種類       | バージョン       |
|:-----------------|:------------------|
| OS             |              centos6.7 |
| java           |            jdk-8u60-linux-x64 |
| activator             |              1.3.5 |
| Play Framework             |              2.4.2 |


## ■ホストディレクトリ構成
- Docker
    - WEBアプリソース(▲フォルダ)　　※playで稼働するjavaアプリ　詳細は載せません
        - WEBアプリソースファイル郡(▽ファイル) 
    - ステージングバッチ(▲フォルダ)　※javaアプリをコンパイルするためのバッチ　
        - start-play-docker.sh(▽ファイル)
    - Dockerfile(▽ファイル)
    - javaインストール用ファイル(▽ファイル)

## ■dockerfile

```dockerfile:dockerfile
FROM centos:centos6.7
MAINTAINER osak

# ユーザー指定
USER root

# yum更新
RUN yum update -y
RUN rpm --rebuilddb;  yum install -y wget unzip tar

# javaインストール
RUN cd /usr/local/src
COPY jdk-8u60-linux-x64.rpm /usr/local/src/
RUN rpm -ivh /usr/local/src/jdk-8u60-linux-x64.rpm

# activatorインストール
RUN wget https://downloads.typesafe.com/typesafe-activator/1.3.5/typesafe-activator-1.3.5.zip
RUN unzip typesafe-activator-1.3.5.zip
RUN mv activator-dist-1.3.5 /usr/local/lib
RUN ln -s /usr/local/lib/activator-dist-1.3.5/activator /usr/bin/activator

# WEBアプリソースをコンテナに配置
COPY WEBアプリソース /usr/local/src/play-docker/

# ステージングバッチをコンテナに配置
COPY /ステージングバッチ/*.sh /usr/local/src/

# ステージングバッチ権限設定
RUN chmod 777 /usr/local/src/start-play-docker.sh

# ステージングバッチ実行
RUN /usr/local/src/start-play-docker.sh

# play ポート解放
EXPOSE 9000 

# コンテナ起動後、コンパイル済みプログラムの呼び出し
CMD /usr/local/src/play-docker/target/universal/stage/bin/play-docker -Dhttp.port=9000

```

## ■ステージングバッチ

```shell:start-play-docker.sh
#!/bin/sh

SRC_DIR=/usr/local/src
PRJ=play-docker
PRJ_DIR=$SRC_DIR/$PRJ
LOG=$SRC_DIR/start${PRJ}.log
LOG_DIR=$PRJ_DIR/target/universal/stage/logs
LOG_BK_DIR=$SRC_DIR/logs_backup/$PRJ
AP_BATCH=$PRJ_DIR/target/universal/stage/bin/play-docker
PORT=9000

DATE=`date +"%Y-%m-%d %T %z"`
echo "$DATE Start Maintenance Service" | tee $LOG

if [ -d $PRJ_DIR ]
then
	# Backup log files  ===========================================================
	# If backup directory does not exist, create it
	if [ ! -d $LOG_BK_DIR ]
	then
		mkdir -p $LOG_BK_DIR
	fi

	# If log files exist, copy them to backup directory
	if [ -d $LOG_DIR ]
	then
		cd $LOG_DIR
		DATE=`date +"%Y%m%d_%H%M%S"`
		for log in `find . -name "*.log"`
		do
			cp -rfp $log $LOG_BK_DIR/${log%.*}_$DATE.log
			if [ ! "$?" -eq 0 ]
			then
				DATE=`date +"%Y-%m-%d %T %z"`
				echo "$DATE - [ERROR] - Cannot backup log files." | tee -a $LOG
				exit 1
			fi
		done
	fi

	# Do Staging ==================================================================
	cd $PRJ_DIR
	activator clean stage < /dev/null | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K|A]//g" >> $LOG
	if [ "${PIPESTATUS[0]}" -eq 0 ]
	then
		# Start the application ===============================================
		echo "[OK]" | tee -a $LOG
		# $AP_BATCH -Dhttp.port=$PORT > /dev/null &
	else
		echo ""  >> $LOG
		DATE=`date +"%Y-%m-%d %T %z"`
		echo "$DATE - [ERROR] - $PRJ Staging Failed." | tee -a $LOG
		exit 2
	fi
else
	echo ""  >> $LOG
	DATE=`date +"%Y-%m-%d %T %z"`
	echo "$DATE - [ERROR] - $PRJ_DIR not found." | tee -a $LOG
	exit 3
fi

DATE=`date +"%Y-%m-%d %T %z"`
echo "$DATE - [OK] - $0 Finished." | tee -a $LOG
exit 0
```

## ■ビルド手順

1. cd /Docker　　　　　　　　　　　※Dockerfileの配置してあるフォルダに移動
2. docker build -t 適当なタグ名 .　　　※.(カンマ)まで必要です。
3. docker run -d  --name 適当なコンテナ名 -p 19000:9000  適当なタグ名:latest　※ここではホストポート19000を解放

この状態で、ホストの19000ポートに接続すれば、コンテナ内の9000ポートにアクセスできます。

# おわりに
今回はここまでとしますが、実際はこのdockerコンテナをAWS上のECSで稼働させました。
その話はまた別の機会で。