Docker × Spring Boot 

Docker環境でSpring動作させるHow toです.
間違っていることもあると思うのですが，ご容赦くださいませ．

# 環境
- Windows10
- Docker Desktop v4.12.0
- VSCode v1.71.2

# Spring Bootプロジェクトの作成
[Spring initializr](https://start.spring.io/)でテンプレートを作成します
1. Project:Gradle Project を選択
1. Language:Java を選択
1. Spring Boot:2.74 を選択
1. Artifact:api と入力
1. Java:14 を選択
1. Dependencies:Spring Web , lombok　を追加

Generateでダウンロードします

# build.gradleの修正
VSCodeなどで編集します
```build.gradle
plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

apply plugin: 'application'
mainClassName = 'com.example.api.controller.HomeController'
```

# コーディング
src/main/java/com/example/api/controller/HomeController.java
を作成して,以下のように編集します．
```HomeContoroller.java
package com.example.api.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import com.example.api.model.User;

@SpringBootApplication
@Controller
public class HomeController {

    @GetMapping("/")
    private String hello() {
        return "hello";
    }

     public static void main(String[] args) {
        SpringApplication.run(HomeController.class, args);
    }
}
```
表示するhtmlファイルも作成します
src/main/resources/templates/hello.html
を作成して，以下のように編集します．
```hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Hello World!</title>
</head>
<body>
    <p>Hello World!</p>
</body>
</html>
```
これでSpring Bootの準備は完了です

# Dockerの環境構築

### docker-composeの作成
コンテナをアプリケーション用，DB用，メールサーバー用など管理したいときに使います．
今回はアプリケーションのコンテナのみです．port番号は8085に設定しています．
```docker-compose.yml
version: '3.8'
services:
  java:
    image: openjdk:14-slim
    ports:
      - 8085:8080
    tty: true
    volumes:
      - ./server:/srv:cached
    working_dir: /srv
```

### コンテナの作成
コンテナを作成します
ターミナルを開いて，ルートディレクトリまで移動します
以下のコマンドを打ちます
`docker-compose up -d`

次回からコンテナの起動は
`docker start *コンテナ名*`
停止は
`docker stop *コンテナ名*`
でできます
Docker Desktopが入ってればGUIでもできます

### サーバに入る
Docker上でSpring Bootを動作させるためにコンテナのサーバに入ります．
以下のコマンドを打ちます
`Docker exec -it *コンテナ名* bash`

### Spring Boot のビルド
無事サーバに入れたら前半で作成したSpring BootプロジェクトをDocker上でデプロイします．
`sh gradlew build`
以下のようにBUILD SUCCESSが出てればビルド成功です．
```
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 1m 45s
13 actionable tasks: 1 executed, 12 up-to-date
```

### Spring Bootの起動
ビルドに成功すればbuild/libs 配下にjarファイルが生成されているはずです．該当ファイルを実行することでSpring Bootを起動することができます．
`java -jar build/libs/api-0.0.1-SNAPSHOT.jar`
以下のように表示されていれば成功です．

```
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.4)

2022-10-08 06:51:54.366  INFO 248 --- [           main] c.example.api.controller.HomeController  : Starting HomeController 
using Java 14.0.2 on b5a35d4cb0bd with PID 248 (/srv/build/libs/api-0.0.1-SNAPSHOT.jar started by root in /srv)

~以下省略~
```

この状態で `http://localhost:8085/`にアクセスします
Hello World!が表示されていれば成功です！

# 参考
- [Docker × Spring Boot環境構築](https://qiita.com/A-Kira/items/beaf79a0d39d9839e61e)
- [Dockerで始めるSpring Boot](https://qiita.com/ken0909/items/a3f8594ce677bbc7c4c2)