Podman DesktopでSpring Bootアプリケーションをコンテナ化する

https://developers.redhat.com/sites/default/files/styles/article_feature/public/ST-containers_2x.png?itok=MxQgWIGQ

Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。

この記事は Red Hat DeveloperContainerize a Spring Boot application with Podman Desktop を、許可をうけて翻訳したものです。

本記事で紹介する Podman や Podman Desktop に関する情報を日本語で紹介するX アカウントがあります。こちらもフォローして情報収集に活用ください。(ハッシュタグ #podmanjp)


SpringSpring Bootは、クラウドで動作するJavaアプリケーションを構築するために開発者に愛用されています。Springは、本番環境に対応していることで知られており、コンテナ化を非常にうまく補完してくれます。。State of Spring 2022レポートによると、KubernetesはSpringアプリを実行するための主要なプラットフォームになっています。では、Springアプリケーションをコンテナ化してローカルで実行するにはどうすればいいのでしょうか?ローカル環境からコンテナやKubernetesをシームレスに扱うためのオープンソースツールであるPodman Desktopを使って、これを調べてみましょう。

前提条件

  • Spring Bootアプリケーション:この記事では、GitHubで人気のあるSpring PetClinicサンプルアプリケーションを使用します(図1)。自分のプロジェクトを使うか、Spring Initializrから始めるのも自由です。

https://developers.redhat.com/sites/default/files/screen_shot_2023-10-02_at_10.29.31_am.png

図1:Github上のSpring PetClinicリポジトリ

  • Podman Desktop:コンテナエンジンのPodmanを使ってコンテナをデプロイ、管理するためのGUIベースの強力なツール、Podman Desktopを使ってみましょう。インストールが完了したら、Springアプリケーションのコンテナ化を開始できるようになります。(図2)。

https://developers.redhat.com/sites/default/files/screenshot_2023-10-02_at_1.20.08_pm.png

図2:Podman Desktopのダッシュボード

Spring Bootアプリケーションのコンテナ化

PetClinicリポジトリを使う場合は、アプリケーションのソースコードをクローンすることから始めましょう。

git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic

Mavenを使ってjarファイルをビルドして実行することもできますが、ここではプロジェクトのルートディレクトリにContainerfileを作成することにしましょう。このファイルはtouch Containerfileコマンドで作成することもできますし、IDEから作成することもできます。このサンプルのSpring BootアプリケーションでContainerfileがどのようになるか見てみましょう。

# Start with a base image that has Java 17 installed.
FROM eclipse-temurin:17-jdk-jammy

# Set a default directory inside the container to work from.
WORKDIR /app

# Copy the special Maven files that help us download dependencies.
COPY .mvn/ .mvn

# Copy only essential Maven files required to download dependencies.
COPY mvnw pom.xml ./

# Download all the required project dependencies.
RUN ./mvnw dependency:resolve

# Copy our actual project files (code, resources, etc.) into the container.
COPY src ./src

# When the container starts, run the Spring Boot app using Maven.
CMD \["./mvnw", "spring-boot:run"\]

このContainerfileを構成するコンポーネントを詳しく見てみましょう。

  • FROM eclipse-temurin:17-jdk-jammy

    • 目的:この行は、コンテナの基礎を設定する。
    • 深く掘り下げる:この行は、Java 17がすでにインストールされている既存のイメージを使うようにPodmanに指示します。材料を追加する前に、ケーキのベースとなる味を選ぶようなものだと考えてください。私たちはeclipse-temurinイメージを使いますが、それはJavaインストールの信頼できるソースだからです。
  • WORKDIR /app

    • 目的: コンテナ内の作業スペースを指定します。
    • 深く掘り下げる:コンテナには独自のファイルシステムがあります。ここでは、Podmanに「app」という名前のフォルダをセットアップし、その後の操作のデフォルトの場所にするよう指示しています。
  • COPY commands

    • 目的:ローカルシステムからコンテナにファイルを転送する。
    • 深く掘り下げる:最初のCOPYは、Java開発者がアプリの依存関係を管理するために使用するツールであるMavenの設定を取得します。2つ目のCOPYは、アプリの主要ファイルであるMavenラッパー(mvnw)とプロジェクトの詳細(pom.xml)をコピーします。
  • RUN ./mvnw dependency:resolve

    • 目的: アプリに必要なライブラリとツールをダウンロードします。
    • 深く掘り下げる:このコマンドは、アプリの実行に必要なものすべてをフェッチするためにMavenをアクティブにする。Containerfileでこれを行うことで、コンテナにすべてがきちんとパッケージ化されていることを確認します。
  • COPY src ./src

    • 目的:実際のアプリケーションコードを追加する。
    • 深く掘り下げる:アプリのロジック、機能、リソースはsrcディレクトリにあります。これをコンテナに移動することで、コンテナの実行時に完全なアプリが表示されるようにします。
  • CMD ["./mvnw", "spring-boot:run"]

    • 目的: アプリケーションを起動します!
    • 深く掘り下げる:このコマンドは最後のステップです。この行は、コンテナの起動時にMavenを使ってSpring Bootアプリケーションを実行するようPodmanに指示します。

このContainerfileをPodman Desktopで使用して、Spring Bootアプリケーションのコンテナイメージを作成する準備が整いました(図3)。このアプリケーションのイメージをビルドする前に、選択したIDEでディレクトリ構造とContainerfileを再チェックしましょう。

https://developers.redhat.com/sites/default/files/screen_shot_2023-09-06_at_10.56.17_pm.png

図3:VSCodeのContainerfile。

Podman Desktopでコンテナイメージを構築する

まずPodman DesktopのImagesセクションに行き、右上のBuild an Imageボタンを選択します(図4)。

https://developers.redhat.com/sites/default/files/screen_shot_2023-08-30_at_5.21.57_pm.png

図4:Podmanデスクトップビルドイメージがハイライトされています

これでメニューが開き、spring-petclinicフォルダのルートディレクトリにある、以前に作成したContainerfileへのパスを選択できます。Containerfileを選択すると、コンテナイメージに名前を付けることができます(ここではpetclinic)。次に、Buildをクリックすると、イメージの各レイヤーが作成されるのがわかります。これはローカルのイメージレジストリ(図5のImageセクション)で確認できます。

https://developers.redhat.com/sites/default/files/screen_shot_2023-08-30_at_5.24.54_pm.png

図5:PodmanデスクトップのBuild an Imageメニュー

コンテナ化したアプリケーションを実行する

素晴らしい!Imagesセクションに戻り、ビルドされイメージとしてタグ付けされたコンテナ化されたSpring Bootアプリケーションと、petclinicイメージをビルドするためにダウンロードされたeclipse-temurinベースイメージを確認しましょう。コンテナイメージの右側にあるRunアイコンを使用して、このイメージをシステム上でコンテナとして簡単に実行できます(図6)。

https://developers.redhat.com/sites/default/files/screen_shot_2023-08-30_at_5.49.14_pm.png

図6:コンテナを実行する場所を示すPodman Desktop

PortMappingで、コンテナのポート8080をホストのポート8080に割り当てていることを確認します。その他の設定はデフォルトのままにしておいてください。Start Containerをクリックして、Spring Bootアプリケーションのコンテナ化インスタンスを起動します(図7)。

https://developers.redhat.com/sites/default/files/screen_shot_2023-08-30_at_5.50.38_pm.png

図7:Podman Desktop メニューのコンテナ開始ボタンをクリックする

さて、コンテナを起動して実行した状態で、Podman Desktopのユーザーインターフェイスにある便利な「ブラウザを開く」ボタンを使って、コンテナのURLをブラウザで開いてみましょう(図8)。

https://developers.redhat.com/sites/default/files/screen_shot_2023-08-30_at_5.55.04_pm.png

図8:ブラウザを開くボタンを強調表示したPodman Desktop

完璧です!ContainerfileのstartupコマンドとPodman Desktopで設定したポートマッピングのおかげで、Spring Bootアプリケーションが実行されているように見えます(図9)。

https://developers.redhat.com/sites/default/files/screen_shot_2023-09-05_at_4.17.20_pm.png

図9: Spring BootアプリケーションがChromeで実行されている

これでPetClinicアプリケーションがブラウザで実行されていることが確認できましたが、それだけではありません。ターミナルを呼び出す必要があるその他の機能については、代わりにPodman Desktopを使うことができます(図10)。これには、デバッグや設定変更のためにコンテナにSSH接続したり、コンテナのログを見たり、環境変数を調べたりすることが含まれます。これはすべて、コンテナの起動後に自動的に開く Container Details セクションで実行できます。

https://developers.redhat.com/sites/default/files/okay.png

図10:Podman Desktopのターミナル

まとめ

ローカルのSpring Bootコードからアプリケーションをコンテナ化し、Podman Desktopで実行するようになりました!今では、コンテナとして、Quay.ioDocker Hubのようなレジストリを使用して、環境間でこのアプリケーションを共有し、KubernetesOpenShiftを使用して、様々な異なるクラウドプロバイダにデプロイすることができます。

関連の記事

関連のコンテンツ

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。