Dockerコンテナ上でJavaアプリケーションをビルド&実行

今回は、Docker上に簡単なJavaアプリケーションをビルド、実行する方法についてみていきたいと思います。

以下の環境・IDEで行います。

  • Mac Book M1
  • Intellij

Spring Webプロジェクト生成

プロジェクト生成にはSpring Initalizrを使用して生成します。

簡単なRestful APIを作ってみたいと思いますので、「ADD DEPENDENCIES」を推して依存性に「Spring Web」を追加します。

それから下にある「GENERATE」ボタンを押してダウンロードします。

Controller作成

ここではサンプルControllerを作成します。

「/src/main/java/com/example/demo」の配下に「controller」パッケージを作成します。そこから以下のControllerクラスを作成します。

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {

@GetMapping(value = "/sample", produces = "application/json")
public String get() {
return "Hello World";
}
}

本当に簡単なRest Controllerとなります。Getの「/sample」が呼ばれたら「Hello World」を返却するクラスとなります。

Dockerfile作成

次はDockerfileを作成します。このファイル名は「Dockerfile」である必要がありますので、ご注意してください。

ファイル作成はプロジェクトの最上位(build.gradleと同じに配置)に作成します。

FROM openjdk:15-jdk-alpine

EXPOSE 8080

ADD ./build/libs/*.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]
  • Java15を使用し、OpenJDKの公式Dockerイメージを使います。
  • 8080ポートを公開します。
  • 「build/libs」にあるJARファイルをDockerイメージに追加します。
  • Dockerイメージでコンテナを実行するときにDockerで使用するコマン(java -jar /app.jar)ドを指定します。

Mac M1ではDockerイメージをビルドすることきにプラットフォームを指定していないと以下のエラーが発生する可能性があります。

failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:853105ad984a9fe87dd109be6756e1fbdba8b003b303d88ac0dda6b455f36556: not found

エラーが発生したらDockerfileを以下のよう(プラットフォームを指定)に修正すれば正常にビルドできます。

FROM --platform=linux/x86_64 openjdk:15-jdk-alpine

EXPOSE 8080

ADD ./build/libs/*.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

アプリケーションのビルド

プロジェクトをビルドしてJarファイルを作ります。

ビルドには以下のコメンどを利用します。

$ ./gradlew build

ビルドが完了したら「build/libs」にJarファイルが生成されます。

Dockerイメージのビルド

ここではDockerイメージをビルドしてみます。コマンドは以下となります。

$ docker build -t docker-build-exam

「docker-build-exam」はタグ名で好みで書いても構いません。

ここでエラーが発生する方は「Dcokerfile作成」の最後を見てください。

Docker上でアプリケーション起動

以下のコマンドを利用してアプリケーションを起動します。

$ docker run --rm -p8080:8080 docker-build-exam
  • –rm:コンテナが停止されるとDockerがコンテナを削除してくれるオプションです。
  • -p8080:8080:コンテナの8080ポートをDocker hostの8080ポートにマッピングし、外部から呼び出すことができるようにするオプションです。
  • docker-build-exam:イメージビルド時に指定したタグ名です。

アプリケーションが8080ポートで起動できることが確認できますね。

確認

ブラウザを開いて「localhost:8080/sample」を叩いてみましょう。

「Hello World」が正常に表示されることが確認できます。

コメントを残す