はじめに
この記事は「Getting Started:Spring Boot with Docker」から、実際に動作させてみたことを記録したものになります。
Getting Started 通りだと、エラーがでてDockerイメージを作成できないのでその点も記載します。
Spring Boot アプリケーションを作成することから始めます。
作業環境は、以下の通りです。
- Java 1.8 以降
- Docker
- IntelliJ IDEA Community Edition
IntelliJ IDEA Community Edition のダウンロードとインストールは、下記記事を参考にしてください。
Docker は下記サイトからダウンロードできます(アカウントの作成が必要)。
Spring Boot のプロジェクト作成
IntelliJ IDEA Community Edition は無償で商用利用も可能な IDE ですが、Spring Boot のプロジェクトを作成できません。
ですので、以下の Spring Initializr というサイトで Spring Boot のプロジェクトを作成します。
基本的にデフォルトなのですが、Dependencies に いくつか追加しています。
項目 | 設定値 | 備考 |
---|---|---|
Project | Gradle Project | |
Language | Java | デフォルト |
Spring Boot | 2.1.6 | デフォルト |
Project Meta | (Group) com.example | デフォルト |
(Artifact) demo | デフォルト | |
options | デフォルト | |
Dependencies | Spring Web Starter | 追加 |
設定ができたら、[Generate the project] をクリックして、自動生成される demo.zip をダウンロードします。
解凍して作成された demo フォルダを IntelliJ IDEA Community Edition で開いたら、Spring Boot のプロジェクト作成は完了です。
Web API の作成
動作を確認するために、Web API のコントローラーを作成します。
src/main/java/com.example.demo/WebApiController
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class WebApiController { @RequestMapping("hello") private String hello() { return "Hello, world!"; } }
Spring Boot の起動
最初から作成されているDemoApplication
クラスを右クリックして、[Run 'DemoApplication.main()']をクリックすると Spring Boot が起動します。
curlコマンドで動作確認すると問題ないようですね。
$ curl localhost:8080/hello Hello, world!
Dockerfile の作成
以下の Dockerfile をプロジェクトのルートに作成します。この情報がなかなかなくて苦労しました。
FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
build.gradle の修正
Getting Started の載っているbuild.gradle
は情報が古く、Spring Initializr
が作成する内容に対応できていません。
その上で間違っているのでタチが悪いです。
なので、build.gradle
を以下のように修正します。
plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' // 追加 id "com.palantir.docker" version "0.22.1" } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } /* 不要なのでコメントアウト task unpack(type: Copy) { dependsOn bootJar from(zipTree(tasks.bootJar.outputs.files.singleFile)) into("build/dependency") } */ docker { name "${project.group}/${bootJar.baseName}" // 不要なのでコメントアウト //copySpec.from(tasks.unpack.outputs).into("dependency") //buildArgs(['DEPENDENCY': "dependency"]) // 追加 files bootJar.archivePath buildArgs(['JAR_FILE': "${bootJar.archiveName}"]) }
ビルド&Docker イメージ作成
下記のコマンドを実行すると、プロジェクトをビルドして Docker イメージを作成できます。
$ ./gradlew build && ./gradlew build docker
Docker コンテナの起動・動作確認
Docker イメージが作成されたか確認します。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE com.example/demo latest b4dd2545afae 5 seconds ago 122MB openjdk 8-jdk-alpine a3562aa0b991 3 months ago 105MB
com.example/demo
がちゃんと作成されていますね。
では、下記コマンドで Docker コンテナを起動します。
$ docker run --name docker-spring-boot -p 8080:8080 -d com.example/demo
状況を確認すると、ちゃんと起動していますね。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc9a551bc20c com.example/demo "java -Djava.securit…" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp docker-spring-boot
動作確認します。
$ curl localhost:8080/hello Hello, world!
問題ありませんね。
Docker コンテナの終了
下記コマンドで Docker コンテナを終了して削除します。
$ docker stop bc9a551bc20c $ docker rm bc9a551bc20c $ docker ps #なにもないことを確認 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker-compose.yml の作成
docker-compose.yml
をプロジェクトのルートに作成します。
version: '3' services: app: build: . image: com.example/demo ports: - "8080:8080" volumes: - /tmp
Docker を起動し動作確認します。
# docker イメージの作成/ docker-compose up -d --build はエラーになる $ ./gradlew build docker # docker の起動 $ docker-compose up -d # 動作確認 $ curl localhost:8080/hello Hello, world! # docker の終了 $ docker-compose down
おわりに
分かってみれば、そう大したことはない内容ですが、公式の情報が間違っていたり不足していたりするとハマりますね。
Docker で Spring Boot の動作確認ができると、jar ファイルの動作確認にもなるのでいいですね。
お役に立てば幸いです。