【Docker、Spring Boot】Eclipseで作成したSpring Boot アプリを Docker で動かす

タイトルの通り、`Eclipse`で作成した`Spring Boot`アプリを`Docker`で動かす方法を調べたので、備忘録として書いていきます。

# Spring Boot アプリから jar を作成

まず、`eclipse`で作成した`spring boot`アプリから、`.jar`を作成します。
`.jar`を作成するためのプロジェクトは、以前作成したものがあるので、中身が気になる方は以下からご確認ください。

https://github.com/NagaJun1/test_spring_boot

#### eclipse での jar の作成の手順（Gradle）

※今回の`jar`の作成手順は、プロジェクトを`Gradle`で作成しているため、`Gradle`での作成手順になります。

（１）プロジェクトを開いた状態から、「ウィンドウ」＞「ビューの表示」＞「Gradleタスク」を選択します。
（「Gradleタスク」が無い場合は「その他」を選択して、ポップアップした項目の中から選択します）
<img alt="gradle_task.png" width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/87836dd3-3887-8a4b-ad83-e6cf02d362ee.png">

（２）`Eclipse`画面下に「Gradleタスク」のタブが表示されるため、タブ内の項目で「プロジェクト名（今回の場合は`test_spring_boot`）」＞「build」＞「bootJar」を選択し、コンテキストメニューから「Gradleタスクの実行」を押下
<img alt="2_Gradle_bootjar.png" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/bbb9dccd-ce68-80e4-f8a7-72317a8c1886.png">

（３）`jar`の作成が成功すると、「プロジェクトフォルダ/build/libs」下に`.jar`ファイルが生成されます。
（今回の場合だと、プロジェクトフォルダ名が`test_spring_boot`）
<img alt="create_jar_after_image.png" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/dd9b0f49-a021-5678-ce38-7b6be7ab4a63.png"><img alt="2_create_jar_after_image.png" width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/b22427f2-9cbd-690d-2d79-beaea5395739.png">

## Docker で Spring Boot アプリを起動
以降の作業では、自身のPC上で`docker`コマンドが実行できることを前提としています。
今回の検証では、`Windows`で作業しており、`docker desktop`をインストールしています。

#### Dockerfile の作成
以下の`Dockerfile`を作成します。
`FROM`の`eclipse-temurin:17-jdk-alpine`は、`.jar`を作成したときの開発環境の`Java`のバージョンに合わせる必要があり、今回の場合では`JavaSE-17`での開発となっています。
`jar`ファイル名称が`test_spring_boot-0.0.1-SNAPSHOT.jar`になっているため、これは各々の環境ごとに修正する必要がありますが、それ以外は変更不要かと思います。

```Dockerfile
FROM eclipse-temurin:17-jdk-alpine
ARG JAR_FILE=target/test_spring_boot-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
```

#### イメージを作成（ビルド）
`Dockerfile`を配置した後、以下の`docker build`コマンドを実行します。
（今回の場合は、生成した`jar`ファイルを移動せずに作業しているため、`build/libs/`下に`jar`ファイルがあることになります。）
以下のコマンドで実行した場合は、イメージ名は`test_spring_boot`となります。

```docker
docker build --build-arg JAR_FILE=build/libs/test_spring_boot-0.0.1-SNAPSHOT.jar -t test_spring_boot .
```
<img alt="image.png" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/49ad03f4-195f-b973-f87b-74e23ba38a5d.png">
<img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/e28f4758-0393-cd89-d78c-650ee6de2031.png">

作成したイメージは、以下のコマンドで確認ができます。
作成した`docker`イメージ、`test_spring_boot`が一覧の中に表示されていれば成功です。
```docker
docker images
```
<img alt="docker_images.png" width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/e7c73d74-8655-dcc9-dfd7-ecaf1c734b89.png">

#### コンテナを起動
先ほど作成したイメージを、以下コマンドを実行することで起動できます。
以下コマンドのままで実行した場合、`Spring Boot`アプリはコンテナの`8080`ポートを使用し、ローカルホストの`8081`ポートでアクセスが可能になります。

```
docker run -p 8081:8080 test_spring_boot
```
<img alt="docker_run.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/cfb9c09e-6442-d849-ac09-e9ad21fdeddc.png">

## 動作確認
動作確認として、`http://localhost:8081`にアクセスします。
実際のアプリの中身は`/controller_test_2/get_sample_json`に作ってあるため、今回は、`http://localhost:8081/controller_test_2/get_sample_json`にアクセスを行います。
ブラウザーで`URL`を入力してアクセスすると以下の様になります。
<img alt="test_1_image.png" width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/ddcfed26-cb5d-6cc7-3b3b-53f2c933ac3d.png">
今回のアプリは、リクエストボディに特定の`JSON`を付与しないとエラーになるような仕様になっているため、次は`postman`を使用して、リクエストを行います。
（詳細が気になる方は、以下をご確認ください。）

https://qiita.com/NagaJun/items/4adf80d2bcd931938fe8

`postman`で正しい`JSON`を設定して行ったリクエストのレスポンスが、以下の様になれば、動作確認成功です。
<img alt="success_req_image.png" width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/15e79545-d86a-482a-593b-828fd366dd07.png">