プログラミング

DockerでSpringBootアプリを動かす方法

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

こんにちは。じゅんです。

今回はSpringBootアプリをDockerで動かしてみたいと思います。
Dockerについてはあまりよく知らないので、イチから調べて自分なりの理解もまとめていきます。


これまでの作業内容については以下の記事にまとめています。

例え話の前提

プログラミングを学ぶ際にはよく料理やレストランを例に考えるようにしています。

アプリケーションはユーザーからのアクセスに応じてWebサイトやデータを返します。
レストランもお客様の注文に対して料理やサービスを返します。

今回もレストランの例として、注文したら料理が出てくる全自動調理器なるものをアプリケーションに例えて考えてみます。

Dockerの前提知識

まず、Dockerを使う上で、DockerコンテナDockerイメージDockerfileという概念を理解する必要があります。

Dockerコンテナとは

Dockerコンテナとは、実際に動いているアプリケーションそのものです。

Dockerの特徴として、このDockerコンテナを持ち運ぶことができるという特徴があります。。
DockerHubというクラウド上の場所から、誰かが作ってくれた実行環境をダウンロードして使用することができるということです。

実際に稼働している1台の全自動調理器のようなものです。
実際に注文が来たら料理を作って提供します。
さらに、実際に稼働している個体単位で簡単にダウンロードすることができる特徴を持っています。

Dockerイメージとは

Dockerイメージとは、アプリケーションのテンプレートのようなものです。

Spring BootをDockerで使用する際には、jarファイルを関連づけることでjarファイルが持つアプリケーションの動作や依存関係、設定ファイルの情報を取得します。

情報の種類Dockerイメージjarファイル説明
アプリケーションコード含まれる含まれるアプリケーションの処理内容
依存関係含まれる含まれる処理に必要なライブラリやフレームワークの情報
設定ファイル含まれる含まれる
(application.propertiesなど)
接続先などの環境変数
実行環境含まれる含まれないOSやミドルウェア
どのような注文の受け方(券売機などの設定)や注文を受けた後の処理を定義する全自動調理器の鋳型のようなものです。

Dockerfileとは

Dockerfileとは、テンプレートを作成してアプリケーションに実体化するまでの手順書です。

実体はDockerイメージを作成してDockerコンテナとして起動するためのコマンドを順番に記述したテキストファイルです。

全自動調理器の鋳型を作成するための手順書のようなものです。

・稼働させるレストランの設備の指定
・全自動調理器の挙動を定義した仕様書の指定
・全自動調理器を起動させる方法の指定

こういった情報が記述されます。

Docker環境の作成

それではDocker環境を作成してみます。

Dockerのインストール

まずDockerを公式ページからDocker Desktopをインストールします。
(バージョンは4.30.0でした)

Docker Desktop: The #1 Containerization Tool for Developers | Docker
Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today ...

Docker Desktopはサインインできたら閉じます。

Dockerfileの作成

プロジェクトのルートディレクトリにDockerfileを作成します。

今回はSpringBootをDockerで起動させるので、SpringBootプロジェクトのルートディレクトに作成します。

なお、Spring Bootアプリの作成については以下に詳しく書いています。

作成したDockerfileにコマンド情報を記述します。

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

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

# アプリケーションを実行
ENTRYPOINT ["java", "-jar", "/app.jar"]
【openjdkのslim】
Dockerイメージにおける「slim」とは、イメージのサイズを小さくした軽量バージョンを指します。
この軽量バージョンは、必要最低限のパッケージとライブラリだけを含むように設計されており、通常は開発や本番環境で使用する際に十分な機能を提供します。

Dockerイメージの作成

次にターミナルで以下のコマンドを実行してDockerイメージを作成します。

Zsh
# Dockerイメージをビルドし、'simple-memo-backend'という名前をつける
docker build -t simple-memo-backend .

コマンドの意味です。

  • build: DockerfileからDockerイメージを作成します。
  • -tオプション: Dockerイメージに名前(タグ)をつけるオプションです。
    指定しないと<none>という名前のDockerイメージが作成されます。
    (管理が困難になるため非推奨)
  • .: Dockerfileが存在するディレクトリを指定します。
    ターミナルの場所に依存するため実行するときはDockerfileが存在するディレクトリで実行する必要があります。

Dockerイメージが作成されたか確認してみます。

Zsh
# Dockerイメージの一覧
docker images

Dockerイメージを作成できました。

Dockerコンテナの起動

次に、ビルドして作成されたDockerイメージを使用してDockerコンテナを起動します。

Zsh
# Dockerコンテナを起動し、ホストの8080ポートをコンテナの8080ポートにマッピング
docker run -d -p 8080:8080 simple-memo-backend

コマンドの意味です。

  • run: Dockerイメージから新しいコンテナを作成し、実行するためのコマンドです。
  • -dオプション: デタッチモードで実行するという意味です。
    デタッチモードで実行しないと作業しているターミナルが実行ログで占領されてしまいます。引き続き同じターミナルでコマンドを実行したい時には-dオプションを使用します。
  • -p 8080:8080: ポートマッピングを表しています。
    これにより、ブラウザで http://localhost:8080 (実行している端末の8080ポート)にアクセスすると、そのリクエストはコンテナ内の8080ポートにルーティングされ、Spring Bootアプリケーションにリクエストを送ることができます。
  • simple-memo-backend: 起動するコンテナの元となるDockerイメージを指定しています。

実行結果です。(出力された文字列はコンテナIDです。)

Dockerコンテナが正常に動作しているかを確認します。

Zsh
# 実行中のDockerコンテナのリストを表示
docker ps

psprocess status の略で、現在起動中のコンテナを表示します。

コンテナIDの先頭文字列が一致していることやIMAGE列の名前がDockerfileで設定した名前になっていることが確認できます。

また、logsコマンドでDockerコンテナのログを確認することもできます。

Zsh
# コンテナを指定してログを表示
docker logs <コンテナID>

runコマンド実行時に-dオプションで非表示にした実行ログが表示されます。

では、実際にSpring Bootが起動しているかAPIのテストをcurlコマンドでしてみます。

コマンドの詳細については以下の記事を参考にしてください。

Zsh
# メモを作成
$ curl -s -X POST -H "Content-Type: application/json" -d 'サンプル0' http://localhost:8080/api/memos
0

# メモ一覧を表示
$ curl -s -X GET http://localhost:8080/api/memos | jq
[
  {
    "id": 0,
    "content": "サンプル0",
    "createdAt": "2024/06/02 09:09:25",
    "updatedAt": "2024/06/02 09:09:25"
  }
]

正常に動作していることが確認できました!

Dockerコンテナの停止

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

Zsh
# コンテナを指定して停止
docker stop <コンテナID>

StatusがExitedになっているため、停止中であることが分かります。

なお、以下のコマンドで再起動することができます。

Zsh
# コンテナを指定して再起動
docker start <コンテナID>

まとめ

以上がDockerの概要とSpring BootをDockerで起動する方法でした。

参考ページを読んでいるだけでは腹落ちしなかったところも、実際に手を動かすことで頭に入ってきました。

忘れかけたらこの図を思い出そうと思います。

Macユーザーの方は手順を参考にぜひやってみてください!

参考文献

【初心者向け】手を動かして覚えるDocker入門 - Qiita
はじめに 本記は「Dockerをこれから触ろう/学ぼうとしている人向け」の記事になります! Dockerの歴史 実際にDockerを動かすハンズオン が記載されています! Dockerとは そもそもDockerて何もの? 一言でいうと、「軽...
MacでDocker再入門 - Qiita
以前にもDockerを触ったのだが、その時はさしたる使用目的もなく、Dockerって何かを知るために触っただけだったので、それ以来放置していた。 ここに来て、open-interpreter等導入にあたり、環境構築の効率化を考えDocker...
https://zenn.dev/grazie/articles/85e34ee1eafc05

コメント