LoginSignup
20
16

More than 5 years have passed since last update.

Docker初心者がimageファイルを開発してみる[Mac]

Last updated at Posted at 2014-10-12

はじめに

最近、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/
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

## 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

参考: Docker開発環境 - Typesafe ActivatorでScalaをインストール

※ 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

参考: Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる

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に公開していますのでご自由にお使いください。

Dockerfile
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ファイルを作成します。

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

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が以下。

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

これでもきちんと動きました。
なるべく軽い環境を作りたい方はご参考まで。

20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16