Spring MVC WEBアプリを Docker 環境で起動する

# Spring MVC WEBアプリを Docker 環境で起動する

## 目的

[Spring MVC WEBアプリ](https://qiita.com/hiroxpepe/items/8da878169d6bf36a001f)を Docker 環境で起動して理解を深めます。  

## 実現すること

ローカル (Ubuntu) の Docker 環境 (Docker Desktop) で Spring MVC WEBアプリの Docker コンテナを起動します。

## 開発環境

+ Windows 11 Home 22H2 を使用しています。  
+ [WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作していきますので macOS の方も参考にして頂けます。  

<details>

WSL (Microsoft Store アプリ版)

```sh
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
```

Ubuntu

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
```

Java JDK [※ 最小構成 Java JDK の導入と Hello World!](https://qiita.com/hiroxpepe/items/8650664e466906a57996)

```sh
$ java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
```

Maven [※ 最小構成 Maven の導入と Hello World!](https://qiita.com/hiroxpepe/items/40f7f199b9be7f9e3b5b)

```sh
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
```

Docker Desktop

```sh
Version 4.16.3 (96739)
```

```sh
$ docker --version
Docker version 20.10.22, build 3a2c30b
```

```sh
$ docker-compose --version
Docker Compose version v2.15.1
```

</details>

※ この記事では基本的に Ubuntu のターミナルで操作を行います。

## "Hello World" を表示する手順

### Spring MVC WEBアプリの作成

[最小構成 Spring MVC WEBアプリの Hello World!](https://qiita.com/hiroxpepe/items/8da878169d6bf36a001f) を参照してください。  

プロジェクトフォルダに移動  
※ ~/tmp/hello-spring-mvc をプロジェクトフォルダとします。

```sh
$ cd ~/tmp/hello-spring-mvc
```

### ビルド

ビルド  
※ target/hello-spring-mvc.war が作成されます。

```sh
$ mvn clean install
```

### docker-compose.yml (Docker) の作成

```sh
$ vim docker-compose.yml
```

ファイルの内容

```yaml
version: '3'
services:
  app:
    image: jetty:10.0.13-jre11-alpine
    ports:
      - "8080:8080"
    volumes:
      - ./target:/var/lib/jetty/webapps
```

※ポイント

+ ホスト側の /target/hello-spring-mvc.war を Docker コンテナ側の /var/lib/jetty/webapps にマウントします。  

### ディレクトリ・ファイル構成

```sh
$ tree
.
├── docker-compose.yml
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── example
│       │           └── springmvc
│       │               ├── WebApplication.java
│       │               ├── config
│       │               │   └── WebMvcConfig.java
│       │               └── controller
│       │                   └── HelloWorldController.java
│       └── resources
│           └── templates
│               └── hello.html
```

### Docker 環境で起動

Docker Compose の確認

```sh
$ docker-compose --version
Docker Compose version v2.15.1
```

コンテナ起動

```sh
$ docker-compose up -d
[+] Running 2/2
 ⠿ Network hello-spring-mvc_default  Created
 ⠿ Container hello-spring-mvc-app-1  Started
```

※ Docker Desktop を確認するとコンテナとして起動しています。  

WEBブラウザで確認  
※ 8080 で 404 - Not Found の場合、ポート 8080 が使用されている(※その残骸などの)可能性があります。  

```sh
http://localhost:8080/hello-spring-mvc/hello
```

WEBブラウザに "Hello World!" と表示することが出来ました。

### [おまけ] Docker イメージを作成する手順

Dockerfile を使用して Docker イメージを作成します。  

Dockerfile 作成

```sh
$ vim Dockerfile
```

ファイルの内容

```sh
FROM jetty:10.0.13-jre11-alpine

COPY target/*.war /var/lib/jetty/webapps/app.war

EXPOSE 8080
```

Docker イメージをビルド

```sh
$ docker build -t app-hello-spring-mvc .
```

app-hello-spring-mvc イメージが作成されました。  

作成したイメージから別のコンテナを起動  

```sh
$ docker run -p 8080:8080 -d --name app-hello-spring-mvc-1 app-hello-spring-mvc
```

WEBブラウザで確認  

```sh
http://localhost:8080/app/hello
```

WEBブラウザに "Hello World!" と表示することが出来ました。  

## まとめ

+ Ubuntu の 最小構成の Java 開発環境で Spring MVC WEBアプリを Docker 環境にてコンテナとして起動させることが出来ました。