【試し】SpringプロジェクトをDocker上で起動させてみる

## やること
### Springプロジェクトをdockerコンテナ上で動かす

#### 使用するもの
- Springプロジェクト（DB接続なし、簡素なものがよい）
    - 例：「ファイルダウンロードアプリ」
    - https://github.com/yusuke/text-file-download
    - 起動させて、アクセスするとテキストがファイルダウンロードするだけ
- Docker(ver 20.10以上)

**※注意**：勉強記録として失敗した内容も残しています

## 実施記録
こちらの記事を参考に実施
**SpringBootのアプリケーションをDockerコンテナで動かす**

https://qiita.com/ke_suke0215/items/1b0128c140dd051b5993

### 手順
1. DockerFileの作成
1. GradleでJarファイル作成
1. Dockerイメージをビルドし、コンテナ作成 `docker build`
1. コンテナ起動 `docker run`
1. アプリ実行

#### DockerFileの作成、GradleでJarファイル作成

`./gradlew clean build`
既存のビルド結果を削除し、クリーンな状態からビルドを実行しjarファイルが生成される。

<img width="500" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/9e98d356-a7dc-7002-f7af-c8aa3b7fb4d7.png">

#### Dockerイメージをビルドし、コンテナ作成

```
PS C:\Users\****\IdeaProjects\text-file-download> docker -v
Docker version 20.10.12, build e91ed57
PS C:\Users\****\IdeaProjects\text-file-download> docker build -t spring-container-sample .
[+] Building 0.0s (2/2) FINISHED
 => [internal] load build definition from Dockerfile                    0.0s
 => => transferring dockerfile: 2B                                      0.0s 
 => CANCELED [internal] load .dockerignore                              0.0s 
 => => transferring context:                                            0.0s 
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open 
/var/lib/docker/tmp/buildkit-mount738487121/Dockerfile: no such file or directory
PS C:\Users\****\IdeaProjects\text-file-download> 
```
失敗しちゃった。

原因
```
Dockerfile: no such file or directory
```
Dockerfileのファイル名は、頭文字以外は小文字が正しい
修正して再ビルド

<img width="500" alt="image2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572406/0629c8f0-74af-85f5-a65c-8077e88bdfd1.png">

```
PS C:\Users\****\IdeaProjects\text-file-download> docker build -t spring-container-sample .
[+] Building 152.9s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                    0.0s
 => => transferring dockerfile: 384B                                    0.0s 
 => [internal] load .dockerignore                                       0.0s 
 => => transferring context: 2B                                         0.0s 
 => [internal] load metadata for docker.io/library/openjdk:17           3.0s 
 => [1/3] FROM docker.io/library/openjdk:17@sha256:528707081fdb9562e  149.3s
 => => resolve docker.io/library/openjdk:17@sha256:528707081fdb9562eb8  0.0s 
 => => sha256:98f0304b3a3b7c12ce641177a99d1f3be56f532473a5 954B / 954B  0.0s
 => => sha256:5e28ba2b4cdb3a7c3bd0ee2e635a5f6481682b77 4.45kB / 4.45kB  0.0s 
 => => sha256:38a980f2cc8accf69c23deae6743d42a87eb3 42.11MB / 42.11MB  33.6s 
 => => sha256:de849f1cfbe60b1c06a1db83a3129ab0ea397 13.53MB / 13.53MB  18.1s 
 => => sha256:a7203ca35e75e068651c9907d659adc721 187.53MB / 187.53MB  145.9s 
 => => sha256:528707081fdb9562eb819128a9f85ae7fe000e2f 1.04kB / 1.04kB  0.0s 
 => => extracting sha256:38a980f2cc8accf69c23deae6743d42a87eb34a54f023  1.3s 
 => => extracting sha256:de849f1cfbe60b1c06a1db83a3129ab0ea397c4852b98  0.4s 
 => => extracting sha256:a7203ca35e75e068651c9907d659adc721dba823441b7  3.2s 
 => [internal] load build context                                       0.2s 
 => => transferring context: 19.75MB                                    0.2s 
 => [2/3] WORKDIR /app                                                  0.3s 
 => [3/3] COPY build/libs/*.jar app.jar                                 0.1s 
 => exporting to image                                                  0.1s 
 => => exporting layers                                                 0.1s 
 => => writing image sha256:7439c961dba53d6583a3bbeb733ed88c00bfa5ab08  0.0s 
 => => naming to docker.io/library/spring-container-sample              0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
```
結果、3分ほど掛かったが成功。

※コマンド補足
- build：Dockerイメージをビルドするよう指示
- -t spring-container-sample：ビルドされるDockerイメージにspring-container-sampleというタグ（名前）を付ける
- .：Dockerビルドコンテキストの場所（Dockerfileへの相対パス）

#### コンテナ起動し、アプリ実行

```
PS C:\Users\****\IdeaProjects\text-file-download> docker run -d -p 8080:8080 spring-container-sample spring-container-sample
faf2392867f7da84f0d5d79729961db1ccf4a19a4f2f74f65e9199d745852deb

PS C:\Users\****\IdeaProjects\text-file-download> 
```

あれ...起動してない。一覧みても、デスクトップアプリ見ても。

デスクトップアプリの方にエラーが出ていた
```
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/example/textfiledownload/TextFileDownloadApplication has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0

（省略）
＿＿下記は訳

スレッド「メイン」java.lang.UnsupportedClassVersionError での例外: org/example/textfiledownload/TextFileDownloadApplication は、より新しいバージョンの Java ランタイム (クラス ファイル バージョン 65.0) によってコンパイルされています。このバージョンの Java ランタイムは、それより上のバージョンのクラス ファイルのみを認識します。 61.0まで

```
Gradle.buildのJavaのバージョンを確認したら21だった。
```
build.gradle
...

java {
    sourceCompatibility = '21'
}

```
Dockerfileに記載したjdkのバージョンを上げて再ビルドして再起動してみる。

```
PS C:\Users\****\IdeaProjects\text-file-download> docker run -d -p 8080:8080 --name spring-container-sample spring-container-sample
b8f08998b3a05b8a3c8bc7228abe452f88f0e5b41ce041118e3b1ca204605c7b
PS C:\Users\****\IdeaProjects\text-file-download> docker container ls -q                                      
b8f08998b3a0         

```
コンテナIDが表示され、立ち上がった気がする。

http://localhost:8080/download へアクセス

＞成功！アプリが実行され、テキストファイルがDownloadされました。

#### コンテナの停止、削除
不要になったら削除しないと、容量をどんどん食ってしまうため停止（また削除）。
```
PS C:\Users\****\IdeaProjects\text-file-download> docker stop spring-container-sample
spring-container-sample
PS C:\Users\****\IdeaProjects\text-file-download> 
PS C:\Users\****\IdeaProjects\text-file-download> docker container ls -q             
PS C:\Users\****\IdeaProjects\text-file-download> docker rm spring-container-sample    
spring-container-sample
PS C:\Users\****\IdeaProjects\text-file-download> 

```


## 参考記事
SpringBootのアプリケーションをDockerコンテナで動かす
(https://qiita.com/ke_suke0215/items/1b0128c140dd051b5993)