WEB

【実践 Java】Spring Boot + Docker の設定

WEB
この記事は約10分で読めます。

はじめに

目的

本記事は、Java で最近人気のある高速 Web フレームワーク、Spring Boot とコンテナ型開発を組み合わせて環境構築することを目的としています。

対象の読者

対象の読者としては、プログラミングの基礎的な知識がある方を想定しています。

例)$ からはじまるものはコマンドで、$ を抜いて実行する 等

構成

このような青色のボックスでは、項目の補足説明をします。
コラムのようなものですので、内容が難しい場合や急いでいる方は読み飛ばしてください。

Spring Boot 概要

Java の世界では、Ruby on Rails のような大規模 Web フレームワークである Play Framework をはじめ、Spring Framework や Apache Struts といったマイクロフレームワークが古くから人気を博してきました。

そこに、期待の新星として登場したのが Spring Boot です。

早速ですが、Spring Boot の特長を見てみましょう。

  • xml ファイルが不要で、設定のエラーが減る
  • アノテーションにより、コード量が削減される
  • Jar ファイルのはたらきにより、Web コンテナ( Tomcat )が不要

Spring Boot は様々なケースにおいて活躍します。

近年ではスマホアプリの興隆により、Android を使ったアプリやサービスの提供のために Java Spring Boot が選ばれることもよくあります。

スマホアプリは、比較的時間や負荷のかかる処理が多いことから非同期の高速性が活かされます。

一方で、スタートアップや新規Webサービス立ち上げのケースなど、SPA(Single Page Application)と組み合わせて、バックエンドとして動くWeb APIを作成したい場合に、より強力な力を発揮する場合もあります。

本記事では、Docker を組み合わせて実際に開発するところまでを紹介します。

Spring Boot における Web API 開発を多くの方に身に着けて頂けることを楽しみにしています。

Spring や Spring Framework との比較

Spring や Spring Framework は簡単に API を作るためにもとても便利なフレームワークです。
しかし、Spring Boot はより後発であるがために、上記で説明した:

  • xml ファイルが不要
  • 多彩なアノテーションが使える
  • サーバーコンテナを立ち上げなくても良い

という Spring や Spring Framework にはない特長を持っています。

これらの違いについて、より詳しく知りたい場合は下記の記事を参照してください。

Spring Initialzr でアプリを生成する

Spring Initializr は条件に合わせて Spring Boot プロジェクトの雛形を生成する Web サービスです。

Web からプロジェクトの設定を指定することで、簡単にプロジェクトの開発を始めることができます。

https://start.spring.io/

上記のサイトをクリックしてください。

ここでは、赤枠のように設定して「GENERATE」を押下します。

ダウンロードした zip ファイルを解凍し、お手元の IDE で開いてください。

ディレクトリ構造

結果として、以下のようなディレクトリ構造になります。

.
├── gradle
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── src
│   ├── main
│       ├── java/com/example/demo
│            └── DemoApprication.java
│       └── resource
│            ├── static
│            ├── template
│            └── application.properties
│   └── test/java/com/example/demo
│       └── DemoAppricationTests.java
├── .gitignore
├── build.gradle
├── gradlew
├── gradlew.bat
├── HELP.md
└── setings.gradle

Docker 環境のインストール

本章では、開発環境として Docker を用いる意義の説明と、Docker のインストールを行います。
Docker での開発に慣れている方は本章を読み飛ばし、次章の Docker イメージの作成に進みましょう。

Docker の利用について

本書では、docker-composeを通して Java および Spring Boot を利用することとします。

Docker はコンテナサービスを提供するアプリケーションです。Java を直接インストールするのではなく、なぜわざわざ Docker 内にインストールするのかというと、以下の2点の理由があります。

  1. 環境差分を排除するため
  2. 環境を閉じ込めるため

それぞれを詳しく見てみましょう。

1. 環境差分をなくすため

本記事の読者によって、Windows や Linux など使用している OS が違う場合があります。

それぞれに応じて Java のバージョンが異なったり、場合によっては Java のパッケージライブラリがこれらの環境に依存することがあります。

Java は、同じ OS 内に複数バージョンをインストールし、それらを切り替えて使うことができます。

しかし、この切り替えの方法は手段が多く、最適な方法を準備するのが難しいのが現状です。

ここで、Docker を利用することで、Java が実行される OS と、アプリ層以下の環境による差分をかなり小さくすることができます。

これにより、本記事を読み進めていくにあたって、インストール時のエラーや、特定のコマンドのエラーなどが少なくなることに繋がります。

2. 閉鎖環境を作る

また、本記事では PostgreSQL のインストールを行います。

PostgreSQL などのデータベースはより低レイヤの API を利用して構築されていることが多いため、Java の実行環境以上に OS やハードウェアの環境に依存するケースが多くなります。

ここでも Docker による環境差分の吸収が力を発揮します。また Java の実行コンテナと PostgreSQL のコンテナを分けることによって、これらのコンテナ間の依存関係を明確にすることが出来ます。

Docker によって、Java やデータベースの環境をコンテナ内に閉じ込めることができますので、何か間違った際にコンテナを作り直したり、廃棄することが簡単にでき、結果としてホストマシンの環境を汚さずに済みます。

docker-compose の利用は本記事の内容を、余計なトラブルなく実行していただくことが大きな狙いです。

また、実際の現場においてもチームメンバーとの環境差異を減らすことも可能でしょう。

Docker インストール

それでは、早速 docker-compose をインストールしましょう。

既にインストールしている場合、設定の章を参照してください。

docker-compose のインストールについては、こちらのDocker公式ドキュメントを参考に読み進めてください。

Macの方は Docker for Mac 、Windowsの方は Docker for Windows をインストールすることで、同時に docker-compose がインストールされます。

Linuxの方は curl でダウンロードしたバイナリファイルからインストールが可能です。

インストール状態の確認

docker-compose がインストールされていることを確認してみましょう。

$ docker-compose version

以下のようにバージョン情報が返却されれば OK です
※ インストールする環境やタイミングによってバージョンは異なります。

$ docker-compose version
Docker Compose version v2.17.3

次章では、 docker-compose を使って Java と Spring Boot をインストールしていきます。

Docker イメージの作成

前章でインストールした docker-compose を使って、Java 環境の準備および Spring Boot のインストールを行う準備をします。

事前に Docker のアプリを立ち上げておいてください。

次に、プロジェクトディレクトリの直下に、下記のファイルを追加します。

# docker-compose.yaml
version: '3.6'
services:
  app:
    image: openjdk:15
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./server:/srv:cached
    working_dir: /srv
# Dockerfile
# ベースイメージを指定
FROM openjdk:15

# ポートをエクスポート
EXPOSE 8080

# 作業ディレクトリを設定
WORKDIR /srv

# ボリュームをマウント(Docker Composeの volumes の設定に基づく)
VOLUME /srv

# アプリケーションの実行コマンドを指定
CMD ["java", "-jar", "your-application.jar"]

ここで、それぞれのファイルの役割を簡単に紹介しておきましょう。

ファイル名役割
docker-compose.yamldocker-composeの定義ファイル。
この中で、Dockerfileを呼び出して、Dockerコンテナのビルドを行います。
DockerfileDockerの定義ファイルです。
利用する公開イメージを取得し、各パッケージをインストールします。

イメージのビルド

以下のコマンドでDocker imageを作成します。

$ docker-compose up -d

環境によりますが、以下のように出力されればイメージの作成は完了です。

$ docker-compose up -d     
[+] Running 4/4
 ✔ app 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                                                        38.9s 
   ✔ 4b26d50a9215 Pull complete                                                                                                                                     10.8s 
   ✔ afc97fa40816 Pull complete                                                                                                                                     11.1s 
   ✔ 035761e41be3 Pull complete                                                                                                                                     33.8s 
[+] Running 2/2
 ✔ Network demo_default  Created                                                                                                                                     0.1s 
 ✔ Container demo-app-1  Started

ローカルホストで確認

http://localhost:8080 で実際に動きが確認できれば完了です。