Docker 環境の Spring Boot WEBサービスのリバースプロキシ構成
目的
Docker 環境で起動した Spring Boot WEBサービスにリバースプロキシを設定して理解を深めます。
実現すること
ローカル (Ubuntu) の Docker 環境 (Docker Desktop) に Nginx と Spring Boot WEBアプリの Docker イメージをデプロイ・起動します。
開発環境
- Windows 11 Home 22H2 を使用しています。
- WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版)
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu
$ 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!
$ 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!
$ 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
Version 4.16.3 (96739)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.15.1
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
"Hello World" を表示する手順
Spring Boot WEBサービスの作成
最小構成 Spring Boot WEBサービスの Hello World! を参照してください。
プロジェクトフォルダに移動
$ cd ~/tmp/hello-spring-boot
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
Docker イメージを作成
Spring Boot WEBサービスを Docker 環境で起動する を参照してください。
docker-compose.yml の修正
リバースプロキシとして Nginx を設定します。
$ vim docker-compose.yml
ファイルの内容
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 を作成
$ vim nginx.conf
ファイルの内容
events {
}
http {
server {
listen 80;
location / {
proxy_pass http://app:8080/;
}
}
}
ディレクトリ・ファイル構成
$ 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 環境で起動
コンテナ起動
$ docker-compose up -d
[+] Running 2/2
⠿ Container hello-spring-boot-app-1 Started
⠿ Container hello-spring-boot-web-1 Started
確認
$ 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ブラウザで確認
http://localhost/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ もしくは別ターミナルのコマンドで確認
$ curl -X GET http://localhost/api/data
{"message":"Hello World!"}
リバースプロキシ動作の確認
Nginx コンテナのログを確認
$ 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 環境にてコンテナとして起動させることが出来ました。