Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。
この記事は Red Hat Developerの Containerize a Spring Boot application with Podman Desktop を、許可をうけて翻訳したものです。
本記事で紹介する Podman や Podman Desktop に関する情報を日本語で紹介するX アカウントがあります。こちらもフォローして情報収集に活用ください。(ハッシュタグ #podmanjp)
Podman(https://t.co/ipoaatoD4a)の非公式Twitterアカウント。#Podman に関する情報を日本語で配信中。ツイートは個人のものであり特定の組織や企業を代表するものではありません。The unofficial Twitter account for Podman. Tweets are my own. #podmanjp
— podmanjp (@podman_jp) July 9, 2023
SpringとSpring Bootは、クラウドで動作するJavaアプリケーションを構築するために開発者に愛用されています。Springは、本番環境に対応していることで知られており、コンテナ化を非常にうまく補完してくれます。。State of Spring 2022レポートによると、KubernetesはSpringアプリを実行するための主要なプラットフォームになっています。では、Springアプリケーションをコンテナ化してローカルで実行するにはどうすればいいのでしょうか?ローカル環境からコンテナやKubernetesをシームレスに扱うためのオープンソースツールであるPodman Desktopを使って、これを調べてみましょう。
前提条件
- Spring Bootアプリケーション:この記事では、GitHubで人気のあるSpring PetClinicサンプルアプリケーションを使用します(図1)。自分のプロジェクトを使うか、Spring Initializrから始めるのも自由です。
図1:Github上のSpring PetClinicリポジトリ
- Podman Desktop:コンテナエンジンのPodmanを使ってコンテナをデプロイ、管理するためのGUIベースの強力なツール、Podman Desktopを使ってみましょう。インストールが完了したら、Springアプリケーションのコンテナ化を開始できるようになります。(図2)。
図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を再チェックしましょう。
図3:VSCodeのContainerfile。
Podman Desktopでコンテナイメージを構築する
まずPodman DesktopのImagesセクションに行き、右上のBuild an Imageボタンを選択します(図4)。
図4:Podmanデスクトップビルドイメージがハイライトされています
これでメニューが開き、spring-petclinic
フォルダのルートディレクトリにある、以前に作成したContainerfileへのパスを選択できます。Containerfileを選択すると、コンテナイメージに名前を付けることができます(ここではpetclinic
)。次に、Buildをクリックすると、イメージの各レイヤーが作成されるのがわかります。これはローカルのイメージレジストリ(図5のImageセクション)で確認できます。
図5:PodmanデスクトップのBuild an Imageメニュー
コンテナ化したアプリケーションを実行する
素晴らしい!Imagesセクションに戻り、ビルドされイメージとしてタグ付けされたコンテナ化されたSpring Bootアプリケーションと、petclinicイメージをビルドするためにダウンロードされたeclipse-temurinベースイメージを確認しましょう。コンテナイメージの右側にあるRunアイコンを使用して、このイメージをシステム上でコンテナとして簡単に実行できます(図6)。
図6:コンテナを実行する場所を示すPodman Desktop
PortMappingで、コンテナのポート8080をホストのポート8080に割り当てていることを確認します。その他の設定はデフォルトのままにしておいてください。Start Containerをクリックして、Spring Bootアプリケーションのコンテナ化インスタンスを起動します(図7)。
図7:Podman Desktop メニューのコンテナ開始ボタンをクリックする
さて、コンテナを起動して実行した状態で、Podman Desktopのユーザーインターフェイスにある便利な「ブラウザを開く」ボタンを使って、コンテナのURLをブラウザで開いてみましょう(図8)。
図8:ブラウザを開くボタンを強調表示したPodman Desktop
完璧です!ContainerfileのstartupコマンドとPodman Desktopで設定したポートマッピングのおかげで、Spring Bootアプリケーションが実行されているように見えます(図9)。
図9: Spring BootアプリケーションがChromeで実行されている
これでPetClinicアプリケーションがブラウザで実行されていることが確認できましたが、それだけではありません。ターミナルを呼び出す必要があるその他の機能については、代わりにPodman Desktopを使うことができます(図10)。これには、デバッグや設定変更のためにコンテナにSSH接続したり、コンテナのログを見たり、環境変数を調べたりすることが含まれます。これはすべて、コンテナの起動後に自動的に開く Container Details セクションで実行できます。
図10:Podman Desktopのターミナル
まとめ
ローカルのSpring Bootコードからアプリケーションをコンテナ化し、Podman Desktopで実行するようになりました!今では、コンテナとして、Quay.ioやDocker Hubのようなレジストリを使用して、環境間でこのアプリケーションを共有し、KubernetesやOpenShiftを使用して、様々な異なるクラウドプロバイダにデプロイすることができます。
関連の記事
- Containerize a Spring Boot application with Podman Desktop
- Knative versus AWS Lambda and Azure Functions
- eBPF application development: Beyond the basics
- How to connect Kubernetes clusters with Service Interconnect
- Learning Go: Stale slices explained