まえがき
私の所属しているプロジェクトでは、仮想マシンの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インストール用ファイル(▽ファイル)
- WEBアプリソース(▲フォルダ) ※playで稼働するjavaアプリ 詳細は載せません
■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
■ステージングバッチ
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
■ビルド手順
- cd /Docker ※Dockerfileの配置してあるフォルダに移動
- docker build -t 適当なタグ名 . ※.(カンマ)まで必要です。
- docker run -d --name 適当なコンテナ名 -p 19000:9000 適当なタグ名:latest ※ここではホストポート19000を解放
この状態で、ホストの19000ポートに接続すれば、コンテナ内の9000ポートにアクセスできます。
おわりに
今回はここまでとしますが、実際はこのdockerコンテナをAWS上のECSで稼働させました。
その話はまた別の機会で。