Breaking News

Default Placeholder Default Placeholder

本記事で書くこと

  • Dockerを使ってSpring Frameworkのローカル環境を作っていきます。
  • 最終的には、Dockerを使って構築したコンテナへCURLを実行し、期待する結果が返ってくるところまでやります。

筆者の環境

  • MacOS Big Sur 11.4
  • Docker version 20.10.7, build f0df350
  • docker-compose version 1.29.2, build 5becea4c

構築する環境

  • Spring Framework 5.3.23
  • Spring Boot Starter 2.7.4
  • OpenJDK 17

やること

  • STSでプロジェクト作成
  • Controller作成
  • Dockerfile作成
  • docker-compose.yaml作成
  • ビルド

STSでプロジェクト作成

  • STSとはSpring Frameworkでの開発をサポートしてくれるIDEのことです
  • 以下の公式サイトから皆さんの環境に合わせてダウンロードしてください

https://spring.io/tools

  • STSの File > New > New Projectの順にクリック
  • 以下のような画面が出てくるので、 Spring Starter Projectをクリック
  • プロジェクト設定を書いていきます
  • 初心者の方は、以下の項目に適切なものを入力してください
    • Name(=プロジェクト名です)
    • Group
    • Description(プロジェクトの説明)
    • Package(パッケージ名)

ちなみに本ブログでは、Gradleを使った開発をしていくので、特に理由がなければGradle Projectを選択してください。

  • 次に依存関係をインストールします
  • ここでは簡易的なプロジェクトにするため、 Spring Webのみインストールします。
  • この画面では特にすることはありません
  • 右下の Finishをクリックしてください
  • これでプロジェクトが作成されました

Controller作成

  • アクセスされた時に適当な文字列を返すAPIのControllerを作成します
  • src > main > java > com.nothingbehind.spring.sample配下に controllersというパッケージを作成してください
  • 作成した controllersパッケージの中に、 IndexController.javaを作成します
  • この IndexController.javaの中身を以下のようにします
package com.nothingbehind.spring.sample.controllers;

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

@RestController
public class IndexController {
    @GetMapping("/")
    public String index() {
        return "hello";
    }
}
  • SpringではControllerにRoutingを書きます
  • この例だと、 /にアクセスされた時、 helloという文字列を返す、という処理になっています

Dockerfile作成

  • docker環境の元となるDockerfileをプロジェクト直下に作成します
FROM openjdk:17

ENV APP /app

COPY . $APP

WORKDIR $APP

RUN microdnf install findutils

docker-compose.yaml作成

  • Dockerfileと同様に、プロジェクト直下に docker-compose.yamlを作成します
version: "3"
services:
  app:
    build: .
    tty: true
    ports:
      - 8080:8080
    volumes:
      - .:/app
    command: ["sh", "gradlew", "bootRun"]
 
  • 8080番ポートでアクセス可能とします
  • コンテナ起動時にサーバが起動するように、 commandには起動コマンドを書いています

ビルド

  • コンテナの中に入ってgradleのビルドコマンドを実行します
$ docker-compose run --rm app sh

# sh gradlew build
...
...
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 1m 32s
7 actionable tasks: 7 executed

コンテナを起動する

  • コンテナを起動します
$ docker-compose up

CURLでアクセスしてみる

curl http://localhost:8080
hello