Docker 環境の Spring Boot WEBサービスのリバースプロキシ構成

# Docker 環境の Spring Boot WEBサービスのリバースプロキシ構成

## 目的

[Docker 環境で起動した Spring Boot WEBサービス](https://qiita.com/hiroxpepe/items/41dd8b4e18213aab1775)にリバースプロキシを設定して理解を深めます。  

## 実現すること

ローカル (Ubuntu) の Docker 環境 (Docker Desktop) に Nginx と Spring Boot 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 Boot WEBサービスの作成

[最小構成 Spring Boot WEBサービスの Hello World!](https://qiita.com/hiroxpepe/items/4a0f5e077155ce41e7ac) を参照してください。  

プロジェクトフォルダに移動

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

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

### Docker イメージを作成

[Spring Boot WEBサービスを Docker 環境で起動する](https://qiita.com/hiroxpepe/items/41dd8b4e18213aab1775#docker-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90) を参照してください。  

### docker-compose.yml の修正

リバースプロキシとして Nginx を設定します。

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

ファイルの内容

```yaml
version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    links:
      - app
  app:
    image: app-hello-spring-boot
    ports:
      - "8080:8080"
```

nginx.conf を作成

```sh
$ vim nginx.conf
```

ファイルの内容

```sh
events {
}

http {
  server {
    listen 80;
    location / {
      proxy_pass http://app:8080/;
    }
  }
}
```

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

```sh
$ tree -I test -I target
.
├── Dockerfile
├── HELP.md
├── docker-compose.yml
├── mvnw
├── mvnw.cmd
├── nginx.conf
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── springboot
        │               ├── SpringbootApplication.java
        │               └── controller
        │                   └── DataController.java
        └── resources
            ├── application.properties
            ├── static
            └── templates
```

### Docker 環境で起動

コンテナ起動

```sh
$ docker-compose up -d
[+] Running 2/2
 ⠿ Container hello-spring-boot-app-1  Started
 ⠿ Container hello-spring-boot-web-1  Started
```

確認

```sh
$ docker ps | grep hello-spring-boot
b86a40e332f9   nginx:latest           "/docker-entrypoint.…"  0.0.0.0:80->80/tcp      hello-spring-boot-web-1
1ea55b1acfcb   app-hello-spring-boot  "java -jar app.jar"      0.0.0.0:8080->8080/tcp  hello-spring-boot-app-1
```

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

WEBブラウザで確認  

```sh
http://localhost/api/data
```

WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。  

※ もしくは別ターミナルのコマンドで確認

```sh
$ curl -X GET http://localhost/api/data
{"message":"Hello World!"}
```

### リバースプロキシ動作の確認

Nginx コンテナのログを確認

```sh
$ docker-compose logs web
hello-spring-boot-web-1  | 172.18.0.1 - - [10/Feb/2023:03:37:29 +0000] "GET /api/data HTTP/1.1" 200 37 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
```

Nginx 経由で Spring Boot WEBアプリにアクセスしています。  

## まとめ

+ Ubuntu の 最小構成の Java 開発環境で Spring Boot WEBサービスとリバースプロキシを Docker 環境にてコンテナとして起動させることが出来ました。