Docker＋Springbootアプリの構築方法（基礎学習用）


## はじめに

ここ最近、メンテナンスやらドキュメント作成やらでソースをゼロから構築する機会がなく、基礎的な部分について忘れがちな状況である。

そんなとき、たまたまみたこの動画をみた。

How to create Docker Image and run Java App (Spring Boot Jar) in a Docker Engine | Tech Primers（2017）
https://www.youtube.com/watch?v=FlSup_eelYE

動画の内容が非常にわかりやすく、そういえばシンプルにゼロから作ったことがないことを思い出しため、勉強用に構築作業を実施。



## 構築要件

Dockerコンテナ上でSpringbootアプリが動くようにする。
外部からRestAPIでアクセスできるようにする。

## DockerDesktop のセットアップ

windows 環境でDockerを動かせるようにする。

### インストーラー
こちらの公式からダウンロード可能
https://hub.docker.com/editions/community/docker-ce-desktop-windows
[Docker Desktop Installer.exe]を起動して手順に沿う

### Docker起動
インストーラー後の再起動で起動する


### ProxySetUp（必要に応じて）

~/.docker/config.json ファイルにproxies 以下を追加する。

```
{
  "credsStore": "desktop",
  "stackOrchestrator": "swarm",
  "credStore": "desktop",
  "proxies":
	 {
	   "default":
	   {
	     "httpProxy": "http://127.0.0.1:3001",
	     "httpsProxy": "http://127.0.0.1:3001",
	     "noProxy": "*.test.example.com,.example2.com"
	   }
	 }
}
```



<参考>
https://docs.docker.com/network/proxy/
 

## Springboot  初期構築

○　SpringbootのProjectを作成
https://start.spring.io/

RestAPI を作りたいために、Dependency にRest Repositoryを追加。
※　目的にあったライブラリを追加する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324074/df67f633-41ec-c13f-39b4-af5c41dc819f.png)


設定をしたあと、GENERATEボタンを押下するとZIPファイルがダウンロードされる


###　ローカルに配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324074/2056aee6-9c28-3dfc-2ec2-80ba720b580f.png)


### Rest用のサンプルモジュールを作成
poc.dockerspringboot配下にcontrollerパッケージを作成して、サンプルファイルを作成


```Java

package poc.dockerspringboot.controller;

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

@RestController
@RequestMapping("/rest/message/helloWorldOnDocker")
public class HelloWorldOnDocker {

    @GetMapping
    public String hello(){
        return "Hello from Docker Container";
    }
}

```
### maven ビルドを実施

mvn clean install の実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324074/5b1743e4-d19d-d3d9-7c52-365143af4449.png)



## Docker File のセットアップ

### Docker Fileの作成
プロジェクト直下にDockerfile を作成


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324074/98a37b96-fa44-e7d0-f7ec-9eabe6b81547.png)

### 作成例

```Docker
FROM adoptopenjdk:11-jre-openj9
ADD target/docker-springboot.jar docker-springboot.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "docker-springboot.jar"]

```


#### FROM: ベースイメージの指定（Java）
OpenJDKの中で、商用でも使えるadoptopenjdkを利用する。
https://hub.docker.com/_/adoptopenjdk

 

### ADD:モジュールの追加
生成したモジュールをDockerに追加する。
target配下にモジュールができているが、jar のファイル名が長いためアウトプット名称を[finalName]で指定する。

```
<build>
	<finalName>docker-springboot</finalName>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
```

参考：spring-boot-maven-pluginの設定情報
https://spring.pleiades.io/spring-boot/docs/current/maven-plugin/reference/html/


### EXPOSE: 外部公開用のポート

Dockerコンテナで開放したいポートを指定

コンテナ内部で、spring-boot 起動時のデフォルトポートは8080
この値を変更したい場合は、application.properties に、server.port=8082　などを追加

Docker起動時に、内部で起動しているポートと外部で公開するポートの紐づけを行う。


### ENTRYPOINT: 起動ポイント

jar コマンドでモジュールを起動。
このコマンドを実行することで、組み込みサーバー（Tomcat）が起動してアクセスを受け付けるようになる。



## コンテナ起動

```
# イメージ作成
docker build -f Dockerfile -t docker-spring-boot .

# 作成物の確認
docker images

# コンテナ起動
docker run -p 8081:8080 docker-spring-boot


```

## アクセス確認

http://localhost:8081/rest/message/helloWorldOnDocker
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324074/87aad0e5-4ab4-c3a2-46cb-b200e7410412.png)


## さいごに

新しい技術的な発見はないものの、たまにこういった作業を実施すると思考がクリアになる。
あとから振り替えられるように、ガイドライン的に記載。