Spring Boot アプリケーションを Dockerで動かす

河上です。

Spring Boot アプリケーションをDockerで動かすためのDockerfileを解説します。


なぜDockerとSpring Bootなのか

Spring Bootはサービスを小さく作って、小さなサービス同士の連携で大きなシステムを作り上げていくことを志向しているフレームワークだと勝手に思っています。

いわゆるマイクロサービスというやつですね。

しかし、個々のアプリケーションを作るのが簡単な一方、複数の小さなサービスを管理、運用していくのはそれなりに難しく、骨の折れる作業になるのは想像に難くないところです。

この問題を解決する第一歩として、まずは単純かつ単一のSpring Boot アプリケーションをDockerコンテナで動かすところから始めてみました。

Spring Boot のバージョンは1.2.1

Mac上でboot2docker v1.4.1 を使って構築しました。


Dockerfileの作成

FROM

FROM ubuntu

これは、ubuntuのイメージから開始を元にコンテナを作ります。
これで元になるイメージが決まります。

RUN

RUN apt-get update && apt-get install -y python-software-properties software-properties-common
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections
RUN add-apt-repository -y ppa:webupd8team/java
RUN apt-get update
RUN apt-get install -y oracle-java8-installer

「RUN」は任意のコマンドを実行します。1つのDockerファイルの中で127までという制限があります。
ここでは、JDKをインストールしています。debeian系のインストールはリポジトリがあって楽ですね。

ENV

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle

「ENV」は見てのとおり環境変数の設定です。
おなじみJAVA_HOMEです。

ADD

ADD ./build/libs/todo-0.0.1.jar todo.jar

「ADD」はコンテナを動かすホスト側のファイルをコンテナ内のファイルシステムに追加します。ADD ソースファイル ターゲットファイルという形式で指定します。
ここでは、Spring Bootアプリケーションをビルドしてできた、実行可能Jarファイルをコンテナに追加しています。

EXPOSE

EXPOSE 8080

「EXPOSE」はコンテナが公開するポートです。
コンテナ間ネットワークに公開されます。ホスト側のネットワークでははいことに注意が必要です。

CMD

CMD ["java", "-jar", "./todo.jar"]

[CMD]はこのDockerfileをビルドしてできたコンテナを起動した時に実行されるコマンドです。Dockerfileの中で最後に書かれたものだけが有効です。ここではSpring Bootの実行可能Jarを実行しています。

Dockerfileとしては以上になります。


Dockerfileのビルド(docker build)

次にDockerfileのビルドしてコンテナイメージを作成するのですが、その前に前述のDockerfileに組み込まれている実行可能Jarを生成するため Spring Boot アプリケーションをビルドしておくのを忘れないで下さい。

gradleだと、./gradlew buildなどとすればjarファイルがbuild/libs配下に出来上がります。

肝心のDockerifleのビルド

docker build -t todo ./

オプション

-t 

タグ付けです。ここではtodoという名前を出来上がるコンテナ名として付けています。

./

これはDockerfileのおいてある場所を指定しています。

初回実行時はベースとなるイメージのダウンロードなどそれなりに時間がかかりますが、次回以降はRUNやADD実行完了後までのイメージがキャッシュされており高速です。Dockerfileを変更しても変更した部分まではキャッシュを使ってくれるのでありがたいですね。

Dockerfileのビルドはこれぐらいです。


コンテナイメージの起動(docker run)

docker run -p 8080:8080 -name todo todo

いよいよコンテナを実行します。

-p 8080:8080

DockerfileでEXPOSE指定したポートをコンテナをホストする側のどのポートにマップするかという指定です。hostPort:containerPort形式で指定します。

-name todo

起動したコンテナに名前を付けています。

最後のtodoは起動するコンテナイメージ名です。
他にも環境変数を流し込んだり、-dでバックグラウンド実行させたりといったオプションがかなりありますが、今回はこのぐらいで。


結果の確認

boot2dockerを使っている場合限定ですが、起動しているコンテナのWebサービスにアクセスするには少しこつが必要です。

boot2docker ip

で、コンテナのホストであるIPを取得します。基本的に192.167.59.103を返すようですが変わるのかどうかは不明です。

このIPの8080でブラウザからアクセスできます。


手順のまとめ

  1. Dockerfileの記述
  2. Spring Boot アプリケーションをビルドして実行可能Jarを作る
  3. Dockerfileをビルドしてコンテナイメージを作る。その際に実行可能Jarを含める。
  4. コンテナイメージを起動する

構築してみて

簡単だしすごく可能性を感じました。

しかし、単独でアプリケーションをコンテナ化したところであまりDockerの強力さも伝わらないので、次は独立したデータベースサーバと、アプリケーションを別々のコンテナとして作成し、連携させるところまでやりたいと思います。

動作する完全なサンプルが以下にありますのでご参考まで。

https://github.com/haljik/todo-example/tree/simple

Spring Boot アプリケーションを Dockerで動かす」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中