Spring Bootは実行可能jar形式でパッケージングするのが普通なので、CloudFoundryやHerokuといったPaaSにデプロイするのは簡単だけれども、AWS Elastic Beanstalkみたいにwarのみサポートしている環境だと、warに変換する手間があった(そんなに大変ではない)。
せっかくなのでjarを使いたい。warを捨てたい。なので、Dockerを使うことにした。
やり方はいろいろあるみたいだが、Docker初心者な自分にはこの記事が分かりやすかった。
この記事を試し、書いてあるやり方がセットアップされているmaven archetypeを作ったので、使い方を紹介する。
Maven Archetypeの使い方
Bashの場合
mvn archetype:generate\
-DarchetypeGroupId=am.ik.archetype\
-DarchetypeArtifactId=spring-boot-docker-blank-archetype\
-DarchetypeVersion=1.0.0
コマンドプロンプト(Windows)の場合
mvn archetype:generate^
-DarchetypeGroupId=am.ik.archetype^
-DarchetypeArtifactId=spring-boot-docker-blank-archetype^
-DarchetypeVersion=1.0.0
たいしたことをやっていないので、もちろん自分でDockerfile
作ってもいい。
使用例
プロジェクト作成
$ mvn archetype:generate -B\
-DarchetypeGroupId=am.ik.archetype\
-DarchetypeArtifactId=spring-boot-docker-blank-archetype\
-DarchetypeVersion=1.0.0\
-DgroupId=com.example\
-DartifactId=hajiboot\
-Dversion=1.0.0-SNAPSHOT
アプリケーションのビルド
$ mvn clean package
$ cd target
$ sudo docker build -t spring-boot-docker-demo .
mvn package
するとDockerfile
がtarget
以下にコピーされるようになっている。
Dockerコンテナへデプロイ
$ sudo docker run -p 8080:8080 -t spring-boot-docker-demo
http://localhost:8080にアクセスすれば「Hello World!」が表示されるはず。
AWS Elastic Beanstalkへデプロイ
ここまでローカル開発環境のDockerを使ったけど、Elastic Beanstalkにデプロイするのであれば、ローカルのDockerは不要。
Elastic Beanstalkへのデプロイ方法もいろいろあるけど、ここでは簡単そうなDockerfile
+ Dockerrun.aws.json
+ 実行可能jarファイルをzipに固めて送る方法をとる。(Dockerrun.aws.json
もコピーされるようになっているので、この3点セットはmvn package
でtarget
以下に出来る)
mvn package
のあと、target
ディレクトリに移動するとapp.zip
が出来ているのがわかります。
これは以下のコマンド実行結果を同じです。
$ zip app.zip Dockerfile Dockerrun.aws.json *.jar
これだけであればDockerインストールは不要ですね!
あとはこのzipをAWSにデプロイする。
"AWS Elastic Beanstalk Management Console"に行って、
Platformに"Docker"を選択。
「Launch Now」をクリックして、環境が出来上がるまで数分待つ。
"Health"が"Green"になったら準備OK。
さっき作った、app.zip
を選択して、アプリケーションのバージョンを適当に記入し、"Deploy"をクリック。
アプリケーションがデプロイされたら、"Health"が再び"Green"になる。
Elastic Beanstalkのエンドポイント(default-environment-XXXXXXXX.elasticbeanstalk.com)にアクセスすると"Hello World!"が表示されるはず!
この雛形プロジェクトには"Spring Boot Actuator"が設定されているので、デプロイされた環境の情報もすぐに見れる。
意外と簡単。
元々高いポータビリティがさらに高まりました!
これではっきり言える
War is over!
地味なファイルアップロード方式でデプロイしたが、CUIでのデプロイはまた今度!
Twitterで http://stackoverflow.com/questions/27185671/elastic-beanstalk-docker-and-continuous-integration をお勧めされた。
アプリの作り方に関しては「はじめてのSpring Boot」を読みましょう!