はじめに
最近、Dockerを勉強しはじめたので、実際に自分でもimageファイルとかいうものを作成してみたいと思った。
最終的には、Elastic BeanstalkにScala & Play2で作ったWEBアプリをデプロイしたい。
開発サイクル
imageファイルの開発は、細かくわけてやったほうが良さそうに思われる。
たとえば、javaやscalaやplayをインストールしたimageを最初に用意しておき、Docker Hubに登録してしまう。
次に、それをもとにplayアプリケーションを構築していけばいいのではなかろうか…。
Docker Hubは、ユーザーが作ったimageファイルを公開できる場所…と思われる。
scalaやplayをバージョンアップしたいときには、最初のimageを更新すれば、それに依存するimageもDockerfileを書き換えることなく更新できそう。
準備
1.Dockerのインストール
まずは、Dockerをインストールしておきます。
Macの場合は、https://github.com/boot2docker/osx-installer/releasesから、緑色のボタン(Boot2Docker-X.X.X.pkg)を押してインストーラーをダウンロードするのが早そうです。
2.Docker Hubへの登録
Docker Hubに会員登録しておきます。
3.AWSへの登録(必要なら)
Elastic Beanstalkを使いたい場合には、AWSに登録しておきましょう。
4.VirtualBoxにUbuntu環境を構築
Macの場合、インストーラーを使うとVirtualBoxがインストールされます。
せっかくVirtualBoxがありますし、Ubuntuも簡単に使えるようにしておいたほうが、imageファイルの構築のときに役に立つので、出来ればインストールしておいたほうが良いと思います。
apt-get とかに不慣れな人は練習用におすすめ
インストール方法は、↓この辺を参考に。
VirtualBoxにUbuntu 14.04 LTSをインストールする(準備編)
VirtualBoxにUbuntu 14.04 LTSをインストールする(インストール編)
セットアップ
Dockerをセットアップしておきます。
$ boot2docker init
$ boot2docker up
上記を実行すると、shellに変数をexportするように指示されますので、そのとおりにexportしておきます。
(これをしないとエラーがでます。)
$ export DOCKER_HOST=tcp://localhost:2375
実例
Ubuntu14.04にjava,scala,play2をインストールしたイメージを作る
すでに、そういうイメージはDocker Hubで公開されているでしょうが、それでは勉強にならないので1から構築していきます。
1.必要なパッケージを選ぶ
・Javaの実行環境
・Scala開発環境
・Play2 Framework
が動く環境を構築できればオッケーですので、java & scala & play2 をインストールするDockerfileを書いて、エラーがでたら足りないコマンドをapt-getするように、Dockerfileを修正していく方法をとりました。
2.Dockerfileを書く
空のディレクトリを作成して、そこにDockerfileというテキストファイルを作成します。
$ mkdir java8-scala211-play23
$ cd java8-scala211-play23/
FROM ubuntu:14.04
MAINTAINER Jun Suzuki
# Update apt-get sources AND install packages
RUN apt-get update
RUN apt-get install wget unzip aptitude dpkg debconf -yy
RUN aptitude install software-properties-common -yy
## Java
RUN sudo add-apt-repository -y ppa:webupd8team/java \
&& sudo apt-get -y update \
&& yes | sudo apt-get install oracle-java8-installer
## Scala
RUN wget http://downloads.typesafe.com/scala/2.11.2/scala-2.11.2.tgz -P /home/docker \
&& tar zxvf /home/docker/scala-2.11.2.tgz -C /home/docker \
&& sudo mv /home/docker/scala-2.11.2 /usr/local \
&& ln -s /usr/local/scala-2.11.2 /usr/local/scala
## Play
RUN mkdir -p /home/docker/bin \
&& wget http://downloads.typesafe.com/typesafe-activator/1.2.2/typesafe-activator-1.2.2.zip -P /home/docker \
&& unzip /home/docker/typesafe-activator-1.2.2.zip -d /home/docker \
&& ln -s /home/docker/activator-1.2.2/activator /home/docker/bin/activator
# Set Environment
ENV HOME /home
ENV PATH /bin:/usr/bin:/usr/local/scala/bin:/home/docker/bin/
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
ENV SCALA_HOME /usr/local/scala
# Timezone Setting
RUN echo "Asia/Tokyo" > /etc/timezone
RUN /usr/sbin/dpkg-reconfigure -f noninteractive tzdata
※ Dockerfileの作成途中でdpkg-reconfigureが見つからなかったので、下記を実行してどこにあるのか調べました。
$ docker run junsuzuki/java8-scala211-play23 which dpkg-reconfigure
/usr/sbin/dpkg-reconfigure
'docker run イメージ名' に続けてLinuxのコマンドが使えるので、困ったときには役立ちます。
3.ビルド
Dockerfileを書いたら、ビルドしてimageファイルを作ります。
$ docker build -t junsuzuki/java8-scala211-play23 ./
junsuzukiのところは、Docker Hubでの自分のユーザー名を使います。
4.作成したimageファイルをDocker Hubにアップする
$ docker login
$ docker push junsuzuki/java8-scala211-play23
play2のサンプルアプリケーションをElastic Beanstalkにデプロイ
上記のimageファイルにplayサンプルアプリケーションを追加したimageファイルを作ります。
1.Playのサンプルアプリケーションを作成する
$ cd ..
$ activator new play-sample play-scala
2.Playアプリのコンパイル
作成したplayサンプルアプリケーションのディレクトリに移動して、playアプリをコンパイルしておきます。
$ cd play-sample/
$ activator clean compile stage
3.Dockerfileを書く
Dockerfileを書きます。
さきほどDocker Hubにアップしたimageを元にするので、'FROM'にさきほどのイメージを指定します。
イメージは、Docker Hubに公開していますのでご自由にお使いください。
FROM junsuzuki/java8-scala211-play23
MAINTAINER Jun Suzuki
# Copy the app into the image.
ADD ./target /opt/playapp
# Start app
EXPOSE 80
CMD /opt/playapp/universal/stage/bin/play-sample -Dhttp.port=80
4.ビルド
Dockerfileを書いたら、ビルドしてimageファイルを作ります。
$ docker build -t junsuzuki/play-sample ./
5.作成したimageファイルを実行してみる
Macの場合、ポートフォワーディングの設定をしておきます。
ここでは説明しないので、詳しくは、こちらのサイトを参考にしてください。
$ docker run -p 80:80 junsuzuki/play-sample
あとは、ブラウザで http://localhost:8080 にアクセスすればplayサンプルアプリが表示されます。
6.作成したimageファイルをElastic Beanstalkにデプロイする
まずは、Dockerrun.aws.jsonファイルを作成します。
{
"AWSEBDockerrunVersion": "1",
"Ports" : [{ "ContainerPort": "2375" }]
}
Tip: zipに固めるときには、"Image"タグは入れてはいけないらしいです。Dockerfileですでに指定あるから、という理由っぽい。
次に、Dockerfile, Dockerrun.aws.json, targetディレクトリをまとめてzipに固めます。
targetディレクトリを含めるのは、DockerfileのADDで指定しているため。
$ zip -r app.zip target/ Dockerfile Dockerrun.aws.json
できたzipファイルをブラウザで、AWSコンソールからElastic Beanstalkにデプロイします。
t1.microインスタンスだとメモリが少なくてデプロイに失敗することがあるので注意。とりあえず、t2.smallで動かしてます(t1.micro & t2.micro だとデプロイできなかったので…)。
これで5〜10分ぐらいでElastic Beanstalkが起動してブラウザからアクセス可能になるはずです。
お疲れ様でした。
参考:
Deploying an Application from a Docker Container to AWS Elastic Beanstalk Using Eb
AWS Elastic BeanstalkでDockerコンテナをデプロイしてみた
PentahoをDocker+EC2にデプロイする
(AWS/EC2) t1.micro はすごくメモリが少ない・・・!!
開発サイクル
ここまでくれば、後は、
1.ローカル環境でPlayアプリ開発
2.Playアプリのコンパイル
$ activator clean compile stage
3.Dockerイメージファイルをビルドしてローカルで動作確認
$ docker build -t junsuzuki/play-sample ./
4.Elastic Beanstalkにデプロイ
のサイクルを繰り返せばよいでしょう。
補足
Playアプリだから、DockerイメージにもPlayをいれとこう、と思ってたんですが、よく考えると実行時にはJava実行環境だけあればいい気がしたので、java8だけいれたimageを作成しました。
そのときのDockerfileが以下。
こちらのイメージも公開しています。
java8環境作成用Dockerfile
FROM ubuntu:14.04
MAINTAINER Jun Suzuki
# Update apt-get sources AND install packages
RUN apt-get update
RUN apt-get install wget unzip aptitude dpkg debconf -yy
RUN aptitude install software-properties-common -yy
## Java
RUN sudo add-apt-repository -y ppa:webupd8team/java \
&& sudo apt-get -y update \
&& yes | sudo apt-get install oracle-java8-installer
# clean up
RUN apt-get autoclean && aptitude autoclean
# Set Environment
ENV HOME /home
ENV PATH /bin:/usr/bin:
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
# Timezone Setting
RUN echo "Asia/Tokyo" > /etc/timezone
RUN /usr/sbin/dpkg-reconfigure -f noninteractive tzdata
java8だけでplayアプリを動かすDockerfile
上記のimageを元にplayアプリを動かすDockerfileが以下。
FROM junsuzuki/java8
MAINTAINER Jun Suzuki
# Copy the app into the image.
ADD ./target /opt/playapp
# Start app
EXPOSE 80
CMD /opt/playapp/universal/stage/bin/play-sample -Dhttp.port=80
これでもきちんと動きました。
なるべく軽い環境を作りたい方はご参考まで。