【Java / SpringBoot】Dockerfileから作られたイメージをもとにコンテナを起動し疎通確認を行うまでの流れ

2024/10/24に公開

はじめに

この記事では、簡単なSpringBootアプリをdockerで動かす方法や、その際に使用するdockerコマンドなど、疎通確認までに必要な内容を記載しています。

この記事の対象者

・Dockerについてあまり知らない方、もしくは知識を深めたい方
・SpringBootアプリでdockerコンテナを作成してみたい方
・最近Dockerに触れておらず、復習も兼ねて確認したい方

開発環境

・Java 21
・SpringBoot 3.3.4
・macOS 14.6.1
・Eclipse_2024-06

そもそもDockerとは

ソフトウェアの開発やデプロイを効率化するためのコンテナ技術を提供するプラットフォームです。Dockerコンテナは、アプリケーションとその依存関係(ライブラリや設定ファイルなど)をパッケージ化し、どの環境でも一貫して実行できるようにします。
https://www.docker.com/ja-jp/

Dockerの主な特徴

⚫︎コンテナ技術
Dockerコンテナは、ホストOS上で仮想環境のように独立して動作しますが、仮想マシンよりも軽量で、ホストのリソースを効率的に活用します。

⚫︎一貫性
開発者が自分のローカル環境で動かしたコンテナは、同じイメージを使用して本番環境でも同じように動作するため、環境の違いによるトラブルを減らせます。

⚫︎ポータビリティ
一度作成したDockerイメージは、どのプラットフォームでも同じように動作するため、異なるOSやクラウドサービス間でも簡単に移行できます。

⚫︎依存関係の分離
アプリケーションごとに異なるライブラリや依存関係を持たせることが可能で、システム全体の依存関係によるトラブルを回避できます。

Dockerの基本要素

⚫︎イメージ (Image)
コンテナの実行に必要なアプリケーションや環境設定が含まれた読み取り専用のテンプレート。イメージをもとにコンテナが作成されます。

⚫︎コンテナ (Container)
イメージから起動される実行環境。アプリケーションが実際に動作する場所です。

⚫︎Dockerfile
イメージを作成するための手順を記述するファイル。どのベースイメージを使うかや、どのライブラリをインストールするかなどが書かれています。

⚫︎Docker Hub
Dockerイメージを共有するためのリポジトリサービス。公式イメージや他のユーザーが作成したイメージを取得できます。

SpringBootアプリの作成

・ディレクトリ構成の例

sample-docker-container-app-jar(プロジェクト名)
│
├── src/main/java
│   │
│   └── com.example.demo
│       │
│       ├── controller
│       │   │
│       │   └── SampleController.java
│       │
│       ├── dto
│       │   │
│       │   └── ResponseDto.java
│       │
│       └── SampleDockerContainerAppJarApplication.java
│
├── src/main/resource
│   │
│   └── application.properties
│
....
│
├── target
│   │
│   └── sample-docker-container-app-jar-0.0.1-SNAPSHOT
│
├── Dockerfile
│
└── pom.xml

・SampleController.java

package com.example.demo.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.dto.RequestDto;
import com.example.demo.dto.ResponseDto;

import lombok.extern.slf4j.Slf4j;

@RestController
@Slf4j
public class SampleController {
	
	@GetMapping("/docker/test/jar")
	@ResponseBody
	public ResponseEntity<ResponseDto> testDocker(@RequestParam(required = false) String param) {
		
		log.info("Hello Docker!!");
		
		ResponseDto response = new ResponseDto();
		response.setResponseTest("疎通確認完了");
		
		return new ResponseEntity<ResponseDto>(response, HttpStatus.OK);
	}

}

・ResponseDto.java

package com.example.demo.dto;

import lombok.Data;

@Data
public class ResponseDto {
	
	private String responseTest;

}

・Dockerfile

# ベースイメージとしてOpenJDK 17のslimバージョンを使用
FROM openjdk:21-jdk-slim

# 作成したアプリケーションのJarファイルをイメージ内にコピー
COPY target/sample-docker-container-app-jar-0.0.1-SNAPSHOT.jar /app.jar

# アプリケーションを実行
ENTRYPOINT ["java", "-jar", "/app.jar"]

・jarファイルの生成(Eclipseの場合)

  1. 実行 → Mavenビルド

  2. ゴールに"package"と入力 → 適用 → 実行

  3. ビルドが成功すると"BUILD SUCCESS"と出力される

  4. targetフォルダに、jarファイルが生成される

Dockerイメージを作成

  1. ターミナル、もしくはコマンドプロンプトでプロジェクト直下に移動
sample-docker-container-app-jar %
  1. コマンドを実行しDockerイメージ作成
sample-docker-container-app-jar % docker build -t {イメージ名} .

例:docker build -t myapp:v1.0 .

※成功すると、下記のようなレスポンスが返却される

作成したイメージをもとにDockerコンテナを起動

  1. 作成したイメージを確認
sample-docker-container-app-jar % docker image ls

・作成したイメージの例

  1. コンテナを起動
sample-docker-container-app-jar % docker run [オプション] -p 8080:8080 {イメージ名:タグ}

例:docker run -p 8080:8080 myapp:v1.0
※ポートをホストに公開する必要があり、コンテナ内のポートとホスト側のポートをマッピングするためには、docker runコマンドでポートを指定しないといけない。

・正常に起動できれば下記のようにSpringBootアプリの起動が確認できる

動作確認(PostmanなどのAPI実行ツールを使用)

  1. getリクエストに必要なURIを設定

  2. 処理が成功すると下記のようにレスポンスが返却される

    ・"Hello Docker!!"も正常に出力されているのを確認

最後に

キャプチャが多くて若干読みづらくなってしまったかもしれませんが、この記事が何かの発見や気づきに少しでも繋がったなら幸いです。今回はjarファイルを使用したdockerコンテナの起動でしたが、要件や開発規模によってはwarファイルでのコンテナ起動も重要になるので、業務内で判断できるように知見を広げ深ぼることが重要だなと感じます。
最後までお読みいただきありがとうございました。

Discussion