SpringBootのアプリケーションをDockerコンテナで動かす

# はじめに

この記事では、既に作成されたSpring BootアプリケーションをDockerコンテナで動かす手順について説明します。Dockerは軽量で柔軟性のあるコンテナプラットフォームで、開発から運用に至るまでのワークフローを簡素化し、一貫性を保つことができます。

この記事の目的は、Spring BootアプリケーションをDockerコンテナでどのように動かすか、具体的な手順を通じて理解を深めることです。記事の終わりまでには、Dockerコンテナ内でSpring Bootアプリケーションを正常に動作させることができるようになることを目指しています。

# 必要なツールと環境

この記事では、Spring BootアプリケーションをDockerコンテナで動かすための基本的なツールと環境について説明します。具体的には、以下のものが必要となります。

## Java

Spring BootはJavaベースのフレームワークなので、Javaの環境が必要です。この記事では、Java 17を前提としています。もしまだJavaをインストールしていない場合は、公式サイトまたは適切なパッケージマネージャを使用してインストールしてください。

## Spring Boot

Spring BootはJavaでWebアプリケーションを構築するためのフレームワークです。この記事では、Spring Boot 2.7.11を前提としています。Spring Bootのプロジェクトは、[Spring Initializr](https://start.spring.io/)を使用して簡単に作成することができます。

## Docker

Dockerはアプリケーションをパッケージ化し、他のマシンで同じ環境を再現するためのプラットフォームです。この記事では、Docker 20.10を前提としています。もしまだDockerをインストールしていない場合は、公式サイトからダウンロードしてインストールしてください。

## Gradle

GradleはJavaプロジェクトのビルドツールです。Spring Bootプロジェクトのビルドと、JARファイルの生成に使用します。Gradleはプロジェクトに組み込まれているため、特別にインストールする必要はありません。

# SpringBootにコントローラを作成

コンテナでアプリケーションを起動した際の動作確認を行うため、簡単なコントローラを作成します。内容は以下の通りで、今回は`/src/main/java/com/template/controller/SampleController.java`にファイルを作成しています。

```java
package com.template.controller;

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

@RestController
public class SampleController {

	@GetMapping("/hello")
	public String hello() {
		return "Hello, World!";
	}
}
```

# Dockerfileの作成

DockerコンテナでSpring Bootアプリケーションを実行するためには、Dockerfileを作成する必要があります。Dockerfileは、Dockerイメージの作成手順を定義したテキストファイルです。このセクションでは、Dockerfileの記述方法について説明します。

## Dockerfileとは

Dockerfileは、Dockerイメージの作成手順を記述したテキストファイルです。Dockerfileには、ベースとなるイメージの指定、必要なソフトウェアのインストール、環境変数の設定、アプリケーションのコピー、ポートの公開、実行コマンドなど、イメージ作成に必要な手順が記述されます。

## Dockerfileの記述

Spring Bootアプリケーション用のDockerfileの内容は以下の通りです。ファイルはプロジェクトルーとに配置されています。

```Dockerfile
# ベースイメージの指定
FROM openjdk:17

# ワーキングディレクトリの設定
WORKDIR /app

# アプリケーションのJARファイルをコンテナにコピー
COPY build/libs/*.jar app.jar

# ポートの公開
EXPOSE 8080

# アプリケーションの実行コマンド
ENTRYPOINT ["java", "-jar", "app.jar"]
```

このDockerfileでは、`openjdk:17`イメージをベースにしています。ワーキングディレクトリを`/app`に設定し、ビルド済みのJARファイルをコンテナにコピーしています。また、ポート`8080`を公開し、エントリポイントとしてアプリケーションの実行コマンドを設定しています。

これでDockerfileの作成が完了しました。

# Dockerイメージのビルド

Dockerfileが作成できたら、次はDockerイメージをビルドします。Gradleを使用してアプリケーションをビルドし、Dockerコマンドを使用してDockerイメージをビルドします。

まず、Gradleでアプリケーションをビルドします。以下のコマンドを実行してください。

```shell
./gradlew clean build
```
これで以前のビルドで生成した内容を削除し、クリーンな状態からビルドしてjarファイルを生成します。

次に、DockerコマンドでDockerイメージをビルドします。以下のコマンドを実行してください。今回はイメージのタグを`spring-container-sample`としています。

```shell
docker build -t spring-container-sample .
```

これでDockerイメージのビルドが完了しました。docker imagesコマンドを使用して、ビルドされたイメージを確認することができます。こちらのdockerコマンドの具体的な内容は、以下の通りです。

1. `build`：Dockerイメージをビルドするよう指示
1. `-t spring-container-sample`：ビルドされるDockerイメージに`spring-container-sample`というタグ（名前）を付ける
1. `.`：Dockerビルドコンテキストの場所（Dockerfileへの相対パス）

# Dockerコンテナの操作

Dockerイメージが作成できたら、次はDockerコンテナの操作方法について説明します。

## Dockerコンテナの起動

以下のコマンドでDockerコンテナを起動します。

```shell
docker run -d -p 8080:8080 --name spring-container-sample spring-container-sample
```

この状態で`http://localhost:8080/hello`にアクセスすると`Hello, World!`と表示されるはずです。

## Dockerコンテナの停止

以下のコマンドでDockerコンテナを停止します。

```shell
docker stop spring-container-sample
```

## Dockerコンテナの再起動

以下のコマンドでDockerコンテナを再起動します。

```shell
docker restart spring-container-sample
```

# まとめ

この記事では、Spring BootアプリケーションをDockerコンテナで動かす手順について説明しました。Dockerfileの作成、Dockerイメージのビルド、Dockerコンテナの操作という基本的なステップを通じて、Dockerを使用してSpring Bootアプリケーションを動かす方法を学びました。

Dockerを使用することで、開発環境から本番環境まで一貫した環境を提供し、アプリケーションのデプロイを簡単に行うことができます。これからもDockerの活用を通じて、より効率的な開発ワークフローを追求していきましょう。